@Controller : 전통적인 스프링 MVC Controller
@RestController : Restful 웹서비스 Controller
RESTful이란?
- REST 아키텍처를 구현하는 웹 서비스 (“REST하다!”)
REST란?
- URI로 자원을 표현하고 HTTP Method (
GET / POST / PUT / DELETE)로 행위를 표현
- JSON 또는 XML로 데이터 교환
- 기존 HTTP 인프라를 그대로 활용 → 모든 HTTP 플랫폼에서 사용 가능
- 일반적인 컨벤션으로 API 이해도와 호환성 향상
- RESTful하지 못한 예
- CRUD를 모두 POST로만 처리하는 API
- 경로에 resource·id 외의 정보가 들어가는 경우
예) /students/updateName
@Controller 이해하기
1. Controller는 View 를 반환할 수 있음
- Client가 URI 형식으로 웹 서비스에 요청
- DispatcherServlet 어쩌구 ~ 생략
- Controller가 요청을 처리한 후 ViewName을 반환
- DispatcherServlet 어쩌구 ~ 생략
- ViewResolver가 ViewName에 해당하는 View를 찾아 사용자에게 반환
2. Controller는 Data 를 반환할 수 있음
- Client가 URI 형식으로 웹 서비스에 요청
- DispatcherServlet 어쩌구 ~ 생략
- Controller가 요청을 처리한 후 객체를 반환 (@ResponseBody 필요)
- 반환되는 객체는 Json으로 Serialize 되어 사용자에게 반환된다.
- 객체를 반환할 때는 일반적으로 ResponseEntity로 감싸서 반환한다.
- 객체를 반환하기 위해서는 ViewResolver 대신 HttpMessageConverter가 동작함.
- Spring은 클라이언트의 HTTP Accept 헤더와 서버의 클라이언트 컨트롤러 반환 타입 정보를 조합해 적절한 Converter를 선택
HttpMessageConverter
- 내부에 다양한 Converter가 존재
- 단순 문자열 →
StringHttpMessageConverter
- 객체 →
MappingJackson2HttpMessageConverter
2. @RestController 이해하기
@RestController = @Controller + @ResponseBody
→ Json 형태로 객체 데이터 반환
결론
- @Controller는 ViewName을 반환할 수 있다.
- @Controller가 객체를 반환하려면 @ResponseBody 어노테이션이 필요하고, 반환형태는 Json으로 Serialize된다.
- @RestController는 2.(@Controller+@ResponseBody)와 완전히 동일하다.
- 기능은 같지만 REST API 제공 의도를 명시적으로 드러냄
뭔가 김새지만 대단한 차이가 없었다.
참고블로그