저번 포스팅에서 다뤘던 @Controller의 메소드 파라미터의 종류에 이어서 이번 포스팅에서는 @Controller의 리턴 타입의 종류도 알아보자.
https://kimcoder.tistory.com/515
컨트롤러가 최종적으로 DispatcherServlet에 반환해야 하는 정보는 모델과 뷰다. 만약, 반환할 뷰 정보가 지정되어 있지 않다면 RequestToViewNameTranslator 전략에 의해 자동으로 뷰 이름이 결정된다.
1. 모델에 자동으로 추가되는 정보
- 메소드 리턴 타입에 상관없이 조건만 맞으면 모델에 자동으로 추가되는 정보들이다.
1) @ModelAttribute 오브젝트 또는 커맨드 오브젝트 타입의 파라미터
- 커맨드 오브젝트도 요청 파라미터들이 각 필드에 바인딩되는 오브젝트이지만, @ModelAttribute를 생략한 오브젝트라고 이해하면 된다.
- 아래의 메소드 선언들은 모두 "user"라는 키 이름으로 user 객체가 자동으로 모델에 추가되게 해준다.
public String method(@ModelAttribute("user") User user)
public String method(@ModelAttribute User user)
public String method(User user)
2) Map, Model, ModelMap 타입의 파라미터
- 컨트롤러에서 ModelAndView를 별도로 생성해서 반환하는 경우에도 모델에 자동으로 추가된다.
3) @ModelAttribute 메소드
- @ModelAttribute는 컨트롤러 클래스의 일반 메소드에도 부여할 수 있다. 모델에 추가할 오브젝트를 메소드에서 만들어서 반환하고 싶을 때 사용하면 된다.
@ModelAttribute("levels")
public List<Level> levels() {
return levelService.getAllLevels();
}
- @ModelAttribute 메소드가 반환하는 오브젝트는 클래스 내의 다른 컨트롤러 메소드가 실행될 때 모델에 자동으로 추가된다. 즉, @ModelAttribute 메소드는 같은 클래스 내의 여러 컨트롤러 메소드가 공통적으로 활용하는 정보가 있을 때 활용하는 것이 좋을 것이다.
4) BindingResult 타입의 파라미터
- 다음과 같은 키 이름으로 모델에 자동으로 추가된다.
org.springframework.validation.BindingResult.[검증한 파라미터의 이름]
2. @Controller의 리턴 타입의 종류
1) ModelAndView
- 컨트롤러가 반환해야 할 정보인 모델과 뷰를 같이 담는 오브젝트다.
- 다음과 같이 모델과 뷰 정보를 담는 각각의 메소드를 사용하는 방법이 있고,
@RequestMapping("/test")
public ModelAndView test() {
ModelAndView mav = new ModelAndView();
mav.addObject("subject", "Spring");
mav.setViewName("/test");
return mav;
}
ModelAndView의 생성자를 이용하여 뷰를 미리 담는 방법도 있다.
@RequestMapping("/test")
public ModelAndView test() {
return new ModelAndView("/test").addObject("subject", "Spring");
}
- ModelAndView를 만들어 리턴하는 경우에도 [1. 모델에 자동으로 추가되는 정보]에서 언급한 정보들은 모델에 자동으로 추가된다.
2) String
- 리턴 타입이 String이면 리턴 값은 뷰 이름으로 사용된다. 모델 정보는 모델 파라미터를 이용해서 추가해주면 된다.
- 매우 흔하게 사용되는 방식이다.
3) void
- 리턴 타입이 void라면 RequestToViewNameTranslator 전략을 통해 자동 생성되는 뷰 이름이 사용된다. @RequestMapping에 지정한 value(URL) 값과 뷰 리졸버에 지정된 prefix, suffix 값이 자동으로 반영되어 뷰 이름으로 사용된다.
@RequestMapping("/user")
public void user(Model model) {
model.addAttribute("subject", "Spring);
}
4) 도메인 오브젝트
- 리턴 타입이 단순 오브젝트라면 이는 모델에 자동으로 추가된다. 이 때 모델의 키 이름은 리턴 값의 타입 이름을 따라서 자동으로 지어진다. 예를 들어, User 타입의 도메인 오브젝트를 리턴하는 경우에 해당 모델의 키 이름은 user가 된다.
- 뷰 이름은 기본적으로 RequestToViewNameTranslator 전략을 통해 자동으로 생성된다.
5) Map, Model, ModelMap
- Map, Model, ModelMap 타입의 오브젝트를 직접 만들어서 반환해주면 이 오브젝트는 모델로 사용된다. Map, Model, ModelMap 타입의 리턴 값은 그 자체로 모델 맵으로 인식된다.
6) View
- View 오브젝트의 종류는 아래 포스팅의 [1. View의 종류]를 참고하자.
https://kimcoder.tistory.com/483
3. @ResponseBody
- @ResponseBody가 메소드 레벨에 부여되면, 메소드가 리턴하는 오브젝트는 메시지 컨버터를 통해 바로 HTTP 응답의 메시지 본문으로 전환된다.
- 주로 XML이나 JSON 기반의 메시지로 응답하고 싶을 때 사용된다.
- @RestController 컨트롤러를 사용하면 모든 컨트롤러 메소드가 @ResponseBody 역할을 수행하게 할 수 있다.
● 참고 자료 : 토비의 스프링 3.1 Vol.2
'Spring Series > Spring Framework' 카테고리의 다른 글
[Spring] 프로퍼티 바인딩 방식(1) - PropertyEditor (0) | 2022.09.17 |
---|---|
[Spring] @SessionAttributes와 SessionStatus (0) | 2022.09.14 |
[Spring] @Controller의 메소드 파라미터의 종류 (0) | 2022.09.11 |
[Spring] @RequestMapping 심화(1) - DefaultAnnotationHandlerMapping (0) | 2022.09.08 |
[Spring] web.xml 대신에 WebApplicationInitializer 사용하기 (0) | 2022.09.07 |
댓글