스프링에서 컨트롤러를 지정해주기 위한 어노테이션으로는 @Controller와 @RestController가 있습니다. RestController는 RestAPI 또는 Web API를 개발하기 위해 등장한 어노테이션인데, 이번 포스트에서는 이 둘은 어떤 차이가 있는지 @RestController를 중심으로 정리해보도록 하겠습니다.
Controller
Controller와 RestController의 차이를 알기 위해서는 이 둘이 어떻게 동작하는지에 대해 알 필요가 있습니다.
우선 @Controller의 경우입니다.
- 뷰를 반환하기 위해 @Controller를 사용하는 경우 (일반적인 경우)
- 전달과정
- 클라이언트는 URI 형식으로 웹 서비스에 요청을 보냄
- DispatcherServlet이 요청을 위임할 HandlerMapping을 찾음
- HandlerMapping을 통해 요청을 Controller로 위임함
- Controller는 요청을 처리한 후에 ViewName을 반환함
- DispatcherServlet은 ViewResolver를 통해 View를 찾아 사용자에게 반환함
- 데이터를 반환하기 위해 @Controller를 사용하는 경우
- 전달과정
- Client는 URI 형식으로 웹 서비스에 요청을 보냄
- DispatcherServlet이 요청을 위임할 HandlerMapping을 찾음
- HandlerMapping을 통해 요청을 Controller로 위임함
- Controller는 요청을 처리한 후에 객체를 반환함
- 반환되는 객체는 보통 Json으로 Serialize되어 사용자에게 반환됨
- 컨트롤러를 통해 객체를 반환할 때는 HttpMessageConverter가 동작합니다.
- HttpMessageConver에는 여러 Converter가 등록되어 있습니다.
- 반환해야하는 데이터에 따라 사용되는 Converter가 달라집니다.
- 보통 데이터를 주고 받을 때 페이지가 전환되지 않고 비동기 통신으로 전달받는 경우가 많아 @ResponseBody를 사용합니다.
- 단순 문자열은 StringHttpMessageConver가 사용되고, 객체는 MappingJackson2HttpMessageConverter가 사용됩니다.
- MessageConver는 HandlerAdapter와 Controller가 주고 받는 시점에 작동합니다.
RestController
위에서 서술했듯이 @Controller의 근본적인 역할은 Model에 데이터를 담아 View로 전달해주는 역할입니다. @RestController는 단순히 객체를 반환하고 객체 데이터는 JSON또는 XML형식으로 HTTP응답에 담아 전달합니다. @Controller에서도 @ResponseBody를 사용하면 @RestController의 역할을 충분히 해낼 수 있지만 이러한 방식은 Restful 웹 서비스의 기본 동작이기 때문에 스프링에서는 이 두 동작을 합친 @RestController를 도입했습니다.
즉, @RestController는 JSON또는xml형태로 객체 데이터를 반환하기 위해 사용하며, 뷰를 직접 넘겨주는 것이 아니라 REST방식의 데이터 자체를 넘겨줍니다. 데이트 응답으로 제공하는 REST API개발 시 많이 사용하며 객체를 보통 ResponseEntity에 감싸서 반환합니다.
- 동작구조
- Client는 URI 형식으로 웹 서비스에 요청을 보냄
- DispatcherServlet이 요청을 위임할 HandlerMapping을 찾음
- HandlerMapping을 통해 요청을 Controller로 위임함
- Controller는 요청을 처리한 후에 객체를 반환함
- 반환되는 객체는 Json으로 Serialize되어 사용자에게 반환됨