✅ @Controller와 @RestController
- @Controller: 전통적인 MVC 패턴에서 컨트롤러 역할을 한다. 주로 HTML 페이지 or 템플릿 뷰(JSP, Thymeleaf 등)를 반환할 때 사용된다.
- 특징:
- 리턴 값이 View 이름으로 해석된다.
- 데이터를 반환할 때는 @ResponseBody와 함께 사용해야 JSON 또는 XML 형태로 응답된다.
@Controller
public class MyController {
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("name", "Spring");
return "hello"; // hello.html (뷰 이름)
}
- @RestController: @Controller + @ResponseBody 를 합친 어노테이션으로, JSON, XML, 문자열 등의 데이터 자체를 바로 반환하는 RESTful 웹 서비스를 만들 때 사용된다.
- 특징:
- 모든 메서드의 리턴 값이 HTTP 응답 본문(Response Body)에 직접 들어간다.
2. 별도로 @ResponseBody를 붙이지 않아도 된다.
✅ Spring Boot에서 @RestController로 들어온 HTTP 요청 처리 과정
Spring Boot에서 @RestController를 사용한 HTTP 요청 처리 과정은 클라이언트의 요청을 객체로 변환하고, 비즈니스 로직 실행 후 결과를 다시 HTTP 응답으로 변환하는 구조로 이루어진다. 이 과정에서 HttpMessageConverter가 핵심적인 역할을 수행한다.

- 클라이언트가 HTTP 요청 전송.
- DispatcherServlet이 요청을 수신
- 스프링의 프론트 컨트롤러로서 모든 요청을 가장 먼저 받는다.
- 해당 요청을 처리할 수 있는 Handler(컨트롤러 메서드)를 찾아서 위임한다.
- HandlerMapping이 적절한 컨트롤러(@RestController)를 매핑
- ex: /api/user 요청은 @GetMapping("/api/user")가 붙은 메서드로 연결된다.
- HandlerAdapter가 컨트롤러 메서드를 실행
- 컨트롤러 메서드가 실행되어 Java 객체를 반환한다.
ex: return new User("길동", 30);
- HttpMessageConverter가 작동
- 컨트롤러 메서드가 반환한 객체(User 객체 등)는 그대로는 HTTP 응답에 쓸 수 없다. -> HTTP 응답은 문자열(byte)기반이기 때문이다. 자바 객체는 메모리 상에 존재하는 클래스 인스턴스이니 브라우저나 네트워크에선 전혀 이해할 수 없다. 따라서 이를 client가 이해할 수 있는 형식으로 직렬화를 해줘야 함. 이 역할을 HttpMessageConverter가 담당해줌!
- Spring은 내부적으로 등록된 여러 HttpMessageConverter 중에서, 요청의 Accept 헤더와 반환 객체의 타입을 참고하여 적절한 컨버터를 선택한다. ex: client가
application/json을 원하면 MappingJackson2HttpMessageConverter가 작동하여 객체를 JSON 문자열로 변환한다.
- 변환된 데이터가 HTTP 응답 본문(Response Body)에 쓰임
- 변환된 JSON이 응답의 Body에 포함되어 client에 전달된다.
- 응답 헤더의 Content-Type은 ex:
application/json;charset=UTF-8 으로 자동 설정된다.
=> @RestController는 반환값을 View로 해석하지 않고 HTTP 응답 본문에 직접 작성한다. 그리고 이 반환 객체를 실제 HTTP응답으로 변환해주는 핵심이 바로 HttpMessageConverter! 이 converter는 Spring이 자동으로 구성해주며, JSON 변환엔 보통 Jackson 라이브러리가 사용된다.
<참고 자료>
https://symflower.com/en/company/blog/2024/controller-restcontroller-spring-boot/
https://rebugs.tistory.com/635
https://happiness-life.tistory.com/entry/1-Controller-ResponseBody-RestController-%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90