@Controller vs @RestController

FE.1·2024년 3월 6일
0
post-thumbnail

@Controller

  • @Controller 동작 원리

    1. Client는 URI 형식으로 웹 서비스에 요청을 한다.
    2. DispatcherServlet이 요청을 위임할 HandlerMapping을 찾는다.
    3. HandlerMapping을 통해 요청을 위임할 Controller를 찾는다.
    4. HandlerAdapter를 통해 위임된 Controller에게 요청을 전달한다.
    5. Controller는 요청을 처리한 후에 ViewName을 반환한다.
    6. DispatcherServlet은 ViewResolver를 통해 ViewName에 해당하는 View를 찾아 사용자에게 반환한다.
  • 전통적인 Spring MVC 패턴에서의 컨트롤러, View를 반환하기 위해 사용

  • 파일(.html)을 반환

    • return값을 파일명으로 인식하여 반환 return “index”; → index.html
      • 별도의 application.yml 파일 설정 필요
        spring:
          mvc:
            view:
              prefix: /WEB-INF/views/
              suffix: .jsp
    • 모바일 환경에서는 파일(html)을 받을 수 없다. → @RestController 사용해야 된다.
  • @ResponseBody를 추가적으로 사용하면 파일이 아닌 데이터(xml, json) 반환 가능

@RestController

  • @RestController 동작 원리

    1. Client는 URI 형식으로 웹 서비스에 요청을 한다.
    2. DispatcherServlet이 요청을 위임할 HandlerMapping을 찾는다.
    3. HandlerMapping을 통해 요청을 위임할 Controller를 찾는다.
    4. HandlerAdapter를 통해 위임된 Controller에게 요청을 전달한다.
    5. Controller는 요청을 처리한 후에 ResponseEntity를 반환한다.
    6. 반환된 객체는 JSON으로 Serialize되어 사용자에게 반환된다.
  • 객체 데이터(xml, json)를 반환

  • @Controller + @ResponseBody

ResponseEntity

  • 컨트롤러를 통해 객체를 반환할 때 감싸서 반환하는 객체
  • ViewResolver 대신 HttpMessageConverter가 동작
    • 반환하는 데이터에 따라 사용하는 Converter가 다름
      • 문자열 → StringHttpMessageConverter
      • 객체 → MappingJackson2HttpMessageConverter
    • Controller가 요청을 처리한 후 HandlerAdapter에게 객체를 전달하는 시점에 변환

HttpMessageConverter

  • RequestMappingHandlerAdapter에는 요청 또는 응답의 데이터 형식에 따른 여러 개의 메시지 변환기 HttpMessageConverter가 등록되어 있다.
  • @RequestBody, @ResponseBody 두 개의 어노테이션은 HttpMessageConverter에 의해 수행되는 것!
  • 데이터가 아닌 파일을 반환하는 MessageConverter가 아닌 ViewResolver가 동작함

💡 데이터를 반환하는 RestController와 View를 반환하는 Controller는 서로 다른 파일로 분리하여 작성하는 것이 좋다.

profile
공부하자!

0개의 댓글