개발기록
[Springboot] Controller, RestController는 뭐가 다른가요? 응답이 어떻게 다른가요? 본문
Spring에서 컨트롤러로 지정해주는 어노테이션은 @Controller와 @RestController가 있다.
Spring MVC의 컨트롤러 @Controller와 Restful API 서비스의 컨트롤러인 @RestController의 가장 중요한 다른점은!
HTTP Response Body가 생성되는 방식이다.
# @Controller (Spring MVC Controller)
전통적인 Spring MVC 모델에서 Controller의 역할을 담당하는 @Controller가 붙은 클래스의 역할은 View(화면)을 반환해주기 위해서 사용하고 있었다. 아래 사진은 Spring MVC Container의 구조도이다

1. Client는 특정 URI 형태로 서버에 요청을 보낸다!
2. DispatcherServlet이 요청을 가로채 HandlerMapping을 통해 해당 @Controller로 요청을 전달해준다.
3. @Controller 어노테이션이 붙은 클래스가 요청을 수행하고 전달해줘야할 데이터를 DispatcherServlet에 전달한다.
4. DispatcherServlet의 ViewResolver의 설정에 맞게 이전에 전달받은 view의 경로를 통해 화면을 렌더링 한다
But! @Controller 어노테이션이 View만을 렌더링하기 위한 것은 아니다!
Spring MVC에서 클라이언트가 요청한 데이터를 반환해줘야 하는 경우도 있다. Spring MVC의 컨트롤러는 데이터를 반환하기 위해서
@ResponseBody 어노테이션을 써야 한다. 이를 통해 Controller도 JSON 형태로 데이터를 반환해줄 수 있다

1. Client는 특정 URI 형태로 서버에 요청을 보낸다!
2. DispatcherServlet이 요청을 가로채 HandlerMapping을 통해 해당 @Controller로 요청을 전달해준다.
3. @ResponseBody를 사용하여 Client에게 Json 형태로 데이터를 반환한다.
@RestController가 Data를 반환하기 위해서는 viewResolver 대신에 HttpMessageConverter가 동작합니다.
HttpMessageConverter에는 여러 Converter가 등록되어 있고, 반환해야 하는 데이터에 따라 사용되는 Converter가 달라집니다. 단순 문자열인 경우에는 StringHttpMessageConverter가 사용되고, 객체인 경우에는 MappingJackson2HttpMessageConverter가 사용되며, 데이터 종류에 따라 서로 다른 MessageConverter가 작동하게 됩니다. Spring은 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해 적합한 HttpMessageConverter를 선택하여 이를 처리한다.
# @RestController

@RestController는 Spring MVC Controller에 @ResponseBody가 추가된 것!
즉 이 용도는 JSON형태로 만들어진 데이터를 반환하는 것입니다.
1. Client는 특정 URI 형태로 서버에 요청을 보낸다!
2. DispatcherServlet이 요청을 가로채 HandlerMapping을 통해 해당 @Controller로 요청을 전달해준다.
3. 해당 컨트롤러는 요청을 수행하고 데이터를 반환한다.
View를 제공해주는 @Controller 와 데이터의 반환을 목적으로 하는 @RestController를 구분지어 사용하는 것이
나중에 유지보수할때도 더 편할거 같다는 생각이 든다.
'Spring' 카테고리의 다른 글
| [Springboot] JPA에 대해서 (0) | 2021.06.01 |
|---|---|
| [Springboot] DispatcherServlet은 뭔가요? (0) | 2021.06.01 |
| [Springboot] Bean Container란 뭔가요? (0) | 2021.06.01 |
| [SpringBoot] Spring Security (0) | 2021.05.25 |
| [SpringBoot] Auth2.0 (0) | 2021.05.25 |