본문 바로가기
수업 일지/Spring

65일차 - [Spring] Model/@ModelAttribute/@SessionAttribute

by 쿠쿠씨 2022. 4. 11.
반응형

Model 객체

MVC 모델2 방식에서 사용되는 데이터 저장 객체입니다.

Model 객체는 Controller의 데이터를 View로 전달하는데 사용됩니다.

model.addAttribute( ) 메소드로 애트리뷰트를 저장합니다.

→ JSP의 request.setAttribute( ), session.setAttribute와 같은 동작을 합니다.

 

//Controller
	@RequestMapping(value="model")
	public void model(Model model) {
		model.addAttribute("idx", 23);
		model.addAttribute("page", 11);
	}

model.jsp 요청에 대한 request, response를 jsp로 전달합니다.

 

실행 화면(model.jsp)

 

redirect에서 attribute 전달

	@RequestMapping(value="redirect")
	public String redirect(Model model) {
		model.addAttribute("idx", 99);
		return "redirect:/";
	}

결과는 return "redirect:/?idx=99"; 의 실행 결과와 동일합니다.

model은 redirect에서는 get 요청 파라미터 값으로 데이터를 전달합니다.

 

실행 결과

 

@ModelAttribute

요청 파라미터를 받아 객체를 만들고 프로퍼티에 값을 저장합니다.

객체가 model 객체에 추가되어 애트리뷰트가 자동으로 View에 전달됩니다.

int와 같은 기본 자료형의 경우에는 파라미터로 선언하더라도 기본적으로 화면까지 전달되지 않습니다. 

@ModelAttribute를 사용하면 타입에 관계없이 파라미터를 Model에 담아서 전달합니다.

기본 자료형의 경우 반드시 value 속성 값을 지정해야합니다.

	@RequestMapping(value="modelAttr")
	public void modelAttr(@ModelAttribute(value="idx") int idx) {
	}

idx 값은 model 객체로 view에 전달됩니다.

idx는 파라미터이면서 modelAttr.jsp로 전달하는 model 객체입니다.

 

실행 결과(modelAttr.jsp)

 

@RequestMapping(value="orderAttr")
	public String orderAttr(@ModelAttribute(value="order") Order order) {
		return "modelAttr";
	}
@RequestMapping(value="orderForm2")
	public void orderForm2() {		
	}

입력된 값을 ${@ModelAttribute의 value .프로퍼티}로 가져옵니다.

orderForm2.jsp → orderAttr.jsp → modelAttr.jsp(URL은 orderAttr)

 

@GetMapping

GET 방식으로 요청한 URL과 매핑합니다.

@RequestMapping(method=RequestMethod.GET)와 같습니다.

 

@PostMapping

POST 방식으로 요청한 URL과 매핑합니다.

@RequestMapping(method=RequestMethod.POST)와 같습니다.

 

@SessionAttributes

Model 객체 중 session 범위에서 사용되도록 지정합니다.

여러 개를 배열로 지정할 수 있습니다.

작성 위치는 Controller 클래스 선언 위에서 합니다.

 

@SessionAttribute

session에 저장된 Model 객체를 가져옵니다.

매핑 메소드에서 매개변수와 함께 작성합니다.

 

Controller - 로그인

@Controller
@SessionAttributes("member") 
public class IndexController {

	@GetMapping("/login.do")
	public String login(String success, Model model) {
		model.addAttribute("success", success);
		return "login";
	}
	@PostMapping("login.do")
	public String loginProc(@RequestParam Map<String,String> map, Model model) {
		Member member =  mapper.login(map);	
		String url;
		if(member != null) {
			model.addAttribute("member",member);	//@SessiongAttributes 로 설정
			model.addAttribute("success", "y");
			url = "/";
		}else 
			url = "login.do?success=n";
		return "redirect:" + url;
	}

 

@SessionAttributes("member")

→ Model 객체 중 member는 session scope 값이라는 설정입니다.

model.addAttribute("member",member);

따라서 member는 session scope에 값이 저장됩니다.

 

로그인 과정

login.jsp에서 입력된 email과 password를 요청 파라미터로

Controller의 loginProc메소드의 매개변수 map으로 전달합니다.

매퍼 인터페이스의 login 메소드의 매개변수에 map을 대입합니다.

 

Controller - 회원 정보 수정

	@GetMapping("/update.do")
	public String update(@SessionAttribute Member member) {
		return "member/MemberUpdateForm";
	}
	
	@PostMapping("/save.do")
	public void save(Member member, Model model, HttpServletResponse response) throws IOException {
		mapper.updateMember(member);
		model.addAttribute("member",member);
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		String url="./update.do"; String message="회원정보 수정되었습니다.";
		out.print("<script>alert('" +message +"');location.href='"+url+"'");
		out.print("</script>");
		//return "redirect:update.do";
	}

update( )의 매개변수 @SessionAttribute Member member

→ session에서 member의 데이터를 가져옵니다.

save에서 변경된 member로 update하고 model 객체의 애트리뷰트로 저장합니다.

out 객체는 jsp에서는 내장 객체지만, Spring에서는 선언해서 사용합니다.

반응형

댓글