Java/spring
@Controller vs @RestController
sung960929
2021. 1. 26. 15:01
@Controller
Spring 3에서 주로 사용하던 어노테이션이다. 컨트롤러에 붙여서 사용하며, 뷰(페이지)를 리턴한다.
@ResponseBody를 붙이면 JSON이나 XML과 같은 데이터 형식으로도 리턴 가능하다. 실행 흐름은 아래와 같다.
1. DispatcherServlet으로 클라이언트의 요청이 들어온다.
2. DispatcherServlet은 *HandlerMapping을 이용해 요청을 처리할 컨트롤러를 찾는다.
3. 컨트롤러는 적절한 작업을 수행하고, *ModelAndView 객체를 DispatcherServlet으로 리턴한다.
4. DispatcherServlet은 ModelAndView 객체를 *ViewResolver로 보내 사이트에 표시할 페이지를 찾는다.
5. 페이지에 모델 객체를 보내 화면에 표시한다.
HandlerMapping : DispatcherServlet으로 들어온 요청 정보를 기준으로 어떤 컨트롤러를 사용할 것인지 결정하는 인터페이스. 여러 구현체를 가지고 있다.
ModelAndView : 모델 데이터와 뷰 이름을 가지고 있는 클래스.
ViewResolver : 뷰 이름을 통해 사용될 뷰 객체를 매핑하는 역할을 한다. DispatcherServlet은 기본적으로 JSP를 뷰로 사용할 때 쓰는 InternalResourceViewResolver를 사용한다.
@ResponseBody 어노테이션을 붙이면 위의 3번 과정에서 컨트롤러가 DispatcherServlet으로 뷰를 보내는 대신 데이터를 직접 클라이언트로 전송한다.
@RestController
Spring 4부터 등장한 어노테이션이다. @Controller + @ResponseBody라고 생각하면 되는데, 뷰 페이지를 리턴하지 않고 HTTP Response body에 데이터가 실려 클라이언트로 전송된다.
@RestController를 사용하면 이처럼 컨트롤러가 뷰를 거치지 않고 바로 데이터를 리턴한다. 리턴 형식은 String 뿐만 아니라 int, double, List<>, Map<> 등 다양한 형태가 가능하다.
List 형태로 리턴한다면 내부 원소들이 대괄호로 묶여서 리턴된다.
Map 형태로 리턴한다면, JSON처럼 (키, 값) 쌍으로 묶여서 리턴된다.