BACKEND/JAVA & SPRING

@Controller vs @RestController

이-프 2023. 10. 31. 11:17

@Controller

@Controller로 View 반환하는 case

전통적인 Spring MVC의 @Controller는 주로 View(화면)을 반환하기 위해 사용한다.

  • Client가 URL형식으로 CRUD와 같은 요청을 보낸다.
  • DispatcherServlet이 요청을 위임할 Handler Mapping을 찾고 이를 통해 요청을 Controller에 위임한다.
  • Controller는 요청을 처리한 후, View Name을 Handler Adapter에게 반환하고 이를 DispatcherServlet에게 반환한다.
  • DispatcherServlet은 View Resolver를 통해 View Name에 해당하는 View를 찾아 Client에게 반환한다.

@Controller로 Data 반환하는 case

하지만, 웹과 통신을 할 때, Spring MVC의 Controller는 Data를 반환해야할 경우도 있다.

  • DispatcherServlet이 요청을 Controller에 위임하는 과정까진 위와 같다.
  • 단, Controller는 요청을 처리한 후 객체를 반환하고, 이는 JSON으로 직렬화(Serialize)돼서 Client에게 반환된다.
  • 이때, 반환되는 객체는 HttpMessageConverter가 동작하며 ResponseEntity로 감싸서 반환된다.
  • HttpMessageConverter에는 다양한 Converter가 존재하여 반환 데이터 종류에 따라 달라진다.

    example

    • 단순 문자열 반환 : StringHttpMessageConverter

@RestController

@RestController는 @Controller와 @ResponseBody가 합쳐진 어노테이션이다.

주로, @Controller와 다르게 반환하려는 데이터가 JSON 형태의 객체 데이터이다.

과거에는 JSP, HTML과 같은 View를 직접 전달해줘야 했기에 @Controller를 사용했지만, 최근에는 Backend 개발자는 REST API를 통해 JSON 결과 데이터를 Frontend개발자에게 전달만 하면 되므로 편리성을 위해 @RestController를 사용하는 추세이다.

더불어, @Controller는 ResponseBody가 존재하지 않아 HttpStatus를 설정해줄 수 없다. 즉, API가 에러가 나도 상태 코드를 보여줄 수 없다. 그러므로 ResponseEntity로 감싸서 반환하는 것이 좋다.

🔗 참고 URL : https://backendcode.tistory.com/213


Uploaded by N2T