
개요
RestController와 Controller 어노테이션을 컨트롤러 역할을 담당하는 클래스에 붙여주면서, 이 둘의 정확한 차이점이 무엇일까? 라는 의문점이 생겼습니다. 이번 시간에는, 두 어노테이션의 차이점과 동작원리에 대해 알아보도록 하겠습니다.
@RestController vs @Controller의 차이점
- 결론부터 먼저 알아봅시다.
- 주요한 차이점 : HTTP Response Body가 생성되는 방식
@Controller
- 전통적인 @Controller는 주로 View를 반환하기 위해 사용합니다.
[컨트롤러로 View를 반환하는 경우]

1. 클라이언트는 URI 형식으로 웹 서비스에 요청을 보냅니다.
2. DispatcherServlet이 요청을 위임할 HandlerMapping을 찾습니다.
3. HandlerMapping을 통해 요청을 Controller로 위임합니다.
4. Controller는 요청을 처리한 뒤에 ViewName을 반환합니다.
5. DispatcherServlet은 ViewResolver를 통해 ViewName에 해당하는 View를 찾아 사용자에게 반환합니다.
[컨트롤러로 Data를 반환하는 경우]
- Spring MVC의 컨트롤러를 사용하면서 Data를 반환하는 경우
- Controller에서는 데이터를 반환하기 위해 @ResponseBody 어노테이션을 활용해야 함
- 이를 통해, Controller도 JSON 형태의 데이터를 반환할 수 있음

1. 클라이언트는 URI 형식으로 웹 서비스에 요청을 보냅니다.
2. DispatcherServlet이 요청을 위임할 handlerMapping을 찾습니다.
3. HandlerMapping을 통해 요청을 Controller로 위임합니다.
4. Controller는 요청을 처리한 후에 객체를 반환합니다.
5. 반환되는 객체는 JSON으로 직렬화되어 사용자에게 반환됩니다.
- 컨트롤러를 통해 객체를 반환 할 때는 일반적으로 ResponseEntity로 감싸서 반환.
- ResponseEntity로 감싸져 있는 데이터를 객체로 반환하기 위해 HttpMessageConverter가 동작
- HttpMessageConverter에는 여러 Converter가 등록되어 있음.
- 반환해야 하는 데이터에 따라 사용하는 Converter가 달라짐.
- 단순 문자열 : StringHttpMessageConverter
- 객체 : MappingJackson2HttpMessageConverter
- 위와 같이, 데이터 종류에 따라 서로 다른 MessageConverter가 작동
- Spring은 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보를 조합
- 이를 통해, 적합한 HttpMEssageConverter를 선택하여 이를 처리
- MessageConverter가 동작하는 시점은 HandlerAdapter와 Controller가 요청을 주고 받는 시점
- 위 구조 그림의 4번의 경우, Message를 객체로 변환 by MessageConverter
- 6번의 경우, 객체를 Message로 변환 by MessageConverter
@Controller를 활용한 예제 코드
@RequestMapping("api/v1/hospitals")
@RequiredArgsConstructor
@Controller
public class HospitalRestController {
private final HospitalService hospitalService;
@GetMapping(value="/{id}")
public @ResponseBody ResponseEntity<HospitalResponse> get(@PathVariable Integer id){
HospitalResponse hospitalResponse = hospitalService.getById(id);
return ResponseEntity.ok().body(hospitalResponse);
}
}
- 위 예제의 get 메소드는 Hospital 객체를 ResponseEntity로 감싸서 반환하고 있습니다.
- Java Object를 Json으로 변환하기 위해 @ResponseEntity라는 어노테이션을 붙여줍니다.
@RestController
- @RestController = @Controller + @ResponseBody
- 주용도는 객체 데이터를 JSON 형태로 변환하는 것
- 최근에 데이터를 응답으로 제공하는 REST API를 개발할 때 주로 사용됨
- 객체를 ResponseEntity로 감싸서 변환

1. 클라이언트는 URI 형식으로 웹 서비스에 요청을 보냅니다.
2. DispatcherServlet이 요청을 위임할 handlerMapping을 찾습니다.
3. HandlerMapping을 통해 요청을 Controller로 위임합니다.
4. Controller는 요청을 처리한 후에 객체를 반환합니다.
5. 반환되는 객체는 JSON으로 직렬화되어 사용자에게 반환됩니다.
@RestController를 활용한 예제 코드
@RequestMapping("api/v1/hospitals")
@RequiredArgsConstructor
@RestController
public class HospitalRestController {
private final HospitalService hospitalService;
@GetMapping(value="/{id}")
public ResponseEntity<HospitalResponse> get(@PathVariable Integer id){
HospitalResponse hospitalResponse = hospitalService.getById(id);
return ResponseEntity.ok().body(hospitalResponse);
}
}
- ResponseEntity로 감싸는 이유
- 감싸주지 않고 바로 객체를 반환해주면, 클라이언트가 예상하는 HttpStatus를 설정해줄 수 없게 됩니다.
- (데이터는 반환되지만, 상태 코드가 예상하는대로 나타나지 않을 수 있음)
- ex. 어떤 객체의 생성 요청이라면, Response StatusCode는 201 CREATED를 기대
- 그러나, 객체를 그대로 반환하면, HttpStatus를 설정해줄 수 없다.
- 따라서, 상황에 맞는 HTTPStatus를 설정해주기 위해, ResponseEntity로 감싸서 반환해주어야 한다.
- 위의 경우, 상태 코드를 200 ok로 설정해준 것을 볼 수 있습니다.
'Spring' 카테고리의 다른 글
| [Spring Boot] Spring Boot + React 연동하기 (1) | 2023.01.08 |
|---|---|
| [Spring Boot] Spring Boot 2.7.5 version, JWT를 활용한 인증(Authentication), 인가(Authorization) 구축하기 (0) | 2022.12.26 |