본문으로 바로가기

@RestController vs @Controller

 

@Controller 로 View 반환하기

  1. Client는 URI 형식으로 웹 서비스에 요청을 보냄
  2. DispatcherServlet이 요청을 위임할 HandlerMapping을 찾음
  3. HandlerMapping을 통해 요청을 Controller로 위임한
  4. Controller는 요청을 처리한 후에 ViewName을 반환
  5. DispatcherServlet은 ViewResolver를 통해 ViewName에 해당하는 View를 찾아 사용자에게 반환

Controller가 반환환 뷰의 이름으로부터 View를 렌더링하기 위해서는 ViewResolver가 사용되며, ViewResolver 설정에 맞게 View를 찾아 렌더링함

 

Controller로 Data 반환

Spring MVC의 컨트롤러를 사용하면서 Data를 반환해야하는 경우도 있음. 컨트롤러에서는 데이터를 반환하기 위해 @ResponseBody 어노테이션을 활용해주어야 함. 이를 통해 Contoller도 Json형태로 데이터 반환함

 

VS

 

@RestController

@RestController는 @Controller에 @ResponseBody가 추가된 것임. 당연하게도 RestController의 주용도는 Json 형태로 객체 데이터를 반환 하는 것. 최근에 데이터를 응답으로 제공하는 REST API를 개발할 때 주로 사용하며 객체를 ResponseEntity로 감싸서 반환함. 이러한 동작 이유 역시 @Controller에 @ResponseBody를 붙인 것과 완벽히 동일

  1. Client는 URI 형식으로 웹 서비스에 요청을 보냄
  2. DispatcherServlet이 요청을 위임할 HandlerMapping을 찾음
  3. HandlerMapping을 통해 요청을 Contoller로 위임
  4. Controller는 요청을 처리한 후에 객체를 반환
  5. 반환되는 객체는 Json으로 Serialize되어 사용자에게 반환

컨트롤러를 통해 객체를 반환할 때에는 일반적으로 ResponseEntity로 감싸서 반환함. 객체를 반환하기 위해서는 viewResolver 대신에 HttpMessageConverter가 동작함. HttpMessageConverter에는 여러 Converter가 등록 되어 있고, 반환해야 하는 데이터에 따라 사용되는 Converter가 달라짐. 단순 문자열인 경우에는 StringHttpMessageConverter가 사용. 객체인 경우에는 MappingJackson2HttpMessageConverter가 사용되며, 데이터 종류에 따라 서로 다른 MessageConverter가 작동하게 됨. Spring은 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해 적합한 HttpMessageConverter를 선택하여 이를 처리 함.