개념
컨트롤러에서 생성한 데이터를 담아 view(jsp 등)에 전달하는 객체이다. 따로 생성할 필요 없이, Model 객체를 메서드의 파라미터로 두면 된다.
사용법
public class BoardController{
private BoardMapper mapper;
...
public BoardVO view(Long no, Model model) {
BoardVO vo = mapper.view(no);
model.addAttributes("vo", vo);
return "board/view";
}
}
메서드의 파라미터로 Model 객체를 둠으로써 Model 객체를 별도로 생성하지 않는 것을 확인할 수 있다. request.setAttribute("vo", vo)를 대신하여 model.addAttributes("vo", vo)를 사용하여 jsp 파일에 데이터를 전달한다.
-> jsp에서는 ${vo}로 전달된 데이터를 사용할 수 있다.
//uri: localhost/생략/view.do?no=121&id=ah&page=1
public String ex(Member member, @ModelAttribute("page") int page){
//Member 객체 -> Long no, String id가 존재
}
위 코드는 책에서 발췌한 일부를 수정한 코드이다. 저자는 @ModelAttribute는 타입에 관계없이 무조건 Model에 담아 전달하는 어노테이션이라고 했다. 다시 말해, 위 코드는 uri의 no, id가 Member의 no, id에 할당되는 것은 물론 int 타입인 page에도 1이 할당된다는 것이다.
저자의 요지는 기본 데이터 타입인 변수에 대해서도 @ModelAttribute를 사용하면 바인딩이 지원된다는 것 같다.
여러 글을 참고한 결과는 다음과 같다.
결론을 적용한 코드는 다음과 같이 수정할 수 있다.
//uri: localhost/생략/view.do?no=121&id=ah&page=1
//Member 객체 -> Long no, String id가 존재
//1. @RequestParam 사용
public String ex(Member member, @RequestParam("page") int page){
}
//2. Wrapper 객체로 변경
public String ex(Member member, Integer page){
}
//참고로 명시성을 높이기 위해 객체 앞에 @ModelAttribute를 추가하는 것이 권장된다.
Integer, Long는 wrapper class의 일종으로 결론적으로 객체에 해당한다. 따라서 어노테이션을 생략할 수 있는 것이다.
redirectAttributes.addFlashAttribute("message", "Success!");
보통의 사용법은 다음과 같다. 가령 로그인 결과를 Modal 등으로 띄울 때 사용된다. message 속성의 value를 Success! 혹은 Failed! 등으로 전달하여 모달로 띄우도록 할 수 있다.
redirectAttributes.addAttribute("page", "1");
또 다른 사용법이다. uri 파라미터의 값을 redirect 하면서 지정할 수 있다. 잘 사용되지는 않는다.