1.자동 추가 모델 오브젝트와 자동생성 뷰 이름
다음 4가지는 메소드 리턴 타입에 상관없이 조건만 맞으면 모델에 자동으로 추가 된다.
- @ModelAttribute 모델 오브젝트 또는 커맨드 오브젝트
- Map, Model, ModelMap 파라미터
- @ModelAttribute 메소드
- BindingResult
- @ModelAttribute 모델 오브젝트 또는 커맨드 오브젝트
public void add( @ModelAttribute(“user”) User user )
public void add( @ModelAttribute User user )
public void add( User user )위의 세 경우는 모두 ‘user’라는 이름으로 user 파라미터 오브젝트가 컨트롤럴가 리턴하는 모델에 추가되게 해준다.
- Map, Model, ModelMap 파라미터
-
- 컨트롤러 메소드에 Map, Model, ModelMap 타입의 파라미터를 사용하면 미리 생성된 모델 맵 오브젝트를 전달받아서 오브벡트를 추가할 수 있다.
- @ModelAttribute 메소드
-
- 검색조건 페이지(select 테그) 등의 참조정보가 필요한 경우 사용. 또는 카페의 카테고리 목록 등
- 뷰에서 참고정보로 사용되는 모델 오브젝트를 생성하는 메소드를 지정하기 위해 사용된다.
-
- 모델 오브젝트 생성을 전담하는 메소드를 만들 수 있다.
- @ModelAttribute 분은 메소드는 컨트롤러 클래스 안에 정의하지만 컨트롤러 기능을 담당하지 않는다. 따라서 @RequestMapping을 함께 붙이지 않아야 한다.
- 개별 컨트롤러에서 직접 모델에 추가해줄 수도 있지만, 같은 클래서 내의 모든 컨트롤러 메소드에서 공통적으로 활요하는 정보라면 @ModelAttribute 메소드를 사용하는 것이 편리하다.
@ModelAttribute(“codes”)
public List<Code> codes() {
return codeService.getAllCodes();
}
==> 서비스 계층 오브젝트를 이용해 코드정보의 리스트를 받아서 리턴한다.
==> 리턴되는 오브젝트는 @ModelAttribute에 지정한 ‘codes’라는 이름으로 다른 컨트롤럴가 실행될 때 모델에 자동 추가된다.
- BindingResult
-
- jsp나 프리마커, 벨로시티 등의 뷰에 사용되는 커스텀 태그나 매크로에서 사용되기 때문이다.
2. ModelAndView
@RequestMapping(“/hello”)
public ModelAndView hello(@RequestParam String name, Model model) {
model.addAttribute(“name”, name);
return new ModelAndView(“hello”);
}
- 메소드의 리턴 타입이 스트링이면 이 리턴 값은 뷰 이름으로 사용된다.
@RequestMapping(“/hello”)
public String hello(@RequestParam String name, Model model) {
model.addAttribute(“name”, name);
return “hello”;
}
4. void
- RequestToViewNameResolver 전략을 통해 자동생성되는 뷰 이름이 사용된다.
- URL과 뷰 이름을 일관되게 통일할 수 있다면 void형의 사용을 적극 고려해볼 만하다.
@RequestMapping(“/hello”)
public void hello(@RequestParam String name, Model model) {
model.addAttribute(“name”, name);
}
5. 모델 오브젝트
- 뷰 이름은 RequestToViewNameResolver로 자동생성하는 것을 사용하고 코드를 이용해 모델에 추가할 오브젝트가 하나뿐이라면, Model 파라미터를 받아서 저장하는 대신 모델 오베젝트를 바로 리턴해도 된다.
@RequestMapping(“/view”)
public User view(@RequestParam int id) {
return userService.getUser(id);
}
6. Map, Model, ModelMap
- 주의가 필요. 근본적으로 피하는게 좋다.
@RequestMapping(“/view”)
public Map view(@RequestParam int id) {
Map userMap = userService.getUserMap(id);
return userMap;
}
==> 다음과 같이 사용하자
@RequestMapping(“/view”)
public Map view(@RequestParam int id, Model model) {
model.addAttribute(“userMap”, userService.getUsermap(id));
}
7. View
8. @ResponseBody
- @ResponseBody가 메소드 레벨에 부여되면 메소드가 리턴하는 오브젝트는 뷰를 통해 결과를 만들어내는 모델로 사용되는 대신, 메시지 컨버터를 통해 바로 HTTP 응답의 메시지 본문으로 전환된다.
- 리턴 값이 단일 모댈 오브젝트이고 메시지 컨버터가 뷰와 같은 식으로 동작한다고 이해할 수 있다.
@RequestMapping(“/hello”)
@ResponseBody
public String hello() {
return “<html><body>Hello Spring</body></html>”;
}