@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