본문 바로가기
  • 실행력이 모든걸 결정한다
Spring Series/Spring Framework

[Spring] @Controller의 리턴 방식

by 김코더 김주역 2022. 9. 13.
반응형

저번 포스팅에서 다뤘던 @Controller의 메소드 파라미터의 종류에 이어서 이번 포스팅에서는 @Controller의 리턴 타입의 종류도 알아보자.

https://kimcoder.tistory.com/515

 

[Spring] @Controller의 메소드 파라미터의 종류

이번 포스팅에서는 Spring의 AnnotationMethodHandlerAdapter가 호출하는 컨트롤러 메소드의 파라미터의 종류를 알아보자. 1. HttpServletRequest, HttpServletResponse - 컨트롤러와 DispatcherServlet 사이에서..

kimcoder.tistory.com

 컨트롤러가 최종적으로 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

 

[Spring] View의 종류와 다양한 전략

1. View의 종류 1) InternalResourceView return new ModelAndView("/WEB-INF/view/home.jsp", model); - RequestDispatch의 forward() 또는 include()를 이용하는 방법이다. - 주로 JSP 서블릿을 통해 JSP 뷰를..

kimcoder.tistory.com

 

 

 

3. @ResponseBody

- @ResponseBody가 메소드 레벨에 부여되면, 메소드가 리턴하는 오브젝트는 메시지 컨버터를 통해 바로 HTTP 응답의 메시지 본문으로 전환된다.

- 주로 XML이나 JSON 기반의 메시지로 응답하고 싶을 때 사용된다.

- @RestController 컨트롤러를 사용하면 모든 컨트롤러 메소드가 @ResponseBody 역할을 수행하게 할 수 있다.

 

 

 

● 참고 자료 : 토비의 스프링 3.1 Vol.2

 

반응형

댓글