Spring - @RestController

icblue21·2022년 11월 16일
0

스프링에서 컨트롤러를 지정해주기 위한 어노테이션으로는 @Controller와 @RestController가 있습니다. RestController는 RestAPI 또는 Web API를 개발하기 위해 등장한 어노테이션인데, 이번 포스트에서는 이 둘은 어떤 차이가 있는지 @RestController를 중심으로 정리해보도록 하겠습니다.

Controller

Controller와 RestController의 차이를 알기 위해서는 이 둘이 어떻게 동작하는지에 대해 알 필요가 있습니다.

우선 @Controller의 경우입니다.

  1. 뷰를 반환하기 위해 @Controller를 사용하는 경우 (일반적인 경우)
  • 전달과정
    1. 클라이언트는 URI 형식으로 웹 서비스에 요청을 보냄
    2. DispatcherServlet이 요청을 위임할 HandlerMapping을 찾음
    3. HandlerMapping을 통해 요청을 Controller로 위임함
    4. Controller는 요청을 처리한 후에 ViewName을 반환함
    5. DispatcherServlet은 ViewResolver를 통해 View를 찾아 사용자에게 반환함
  1. 데이터를 반환하기 위해 @Controller를 사용하는 경우
  • 전달과정
    1. Client는 URI 형식으로 웹 서비스에 요청을 보냄
    2. DispatcherServlet이 요청을 위임할 HandlerMapping을 찾음
    3. HandlerMapping을 통해 요청을 Controller로 위임함
    4. Controller는 요청을 처리한 후에 객체를 반환함
    5. 반환되는 객체는 보통 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에 감싸서 반환합니다.

  • 동작구조
  1. Client는 URI 형식으로 웹 서비스에 요청을 보냄
  2. DispatcherServlet이 요청을 위임할 HandlerMapping을 찾음
  3. HandlerMapping을 통해 요청을 Controller로 위임함
  4. Controller는 요청을 처리한 후에 객체를 반환함
  5. 반환되는 객체는 Json으로 Serialize되어 사용자에게 반환됨
profile
github : https://github.com/kiaeh2323 , email : kiaeh9269@gmail.com

0개의 댓글