@Controller vs @Restcontroller 차이점
Spring에서 Controller 를 지정해주기 위한 어노테이션(@)은 @Controller 와 @RestController가 있습니다. 전통적인 Spring MVC의 Controller인 @Controller와 restful 웹 서비스의 컨트롤러인 @RestController의 주요한 차이점은 HTTP Response Body가 생성되는 방식입니다.
프로젝트 진행 중 차이점에 대해 궁금하여 정리해보았습니다.
화면에 표기하려면 restcontroller가 되면 안되고 controller가 되야 함 rest로 하면 return json으로 되기 때문 —- by.구글링
들어가기 앞서 Controller 가 뭔지 부터!!
1. @Controller 이해하기
[ Controller로 View 반환하기 ]
Spring MVC의 컨트롤러인 @Controller 는 주로 View를 반환하기 위해 사용한다.
아래와 같은 과정을 통해 Spring MVC Container는 Client의 요청으로부터 View를 반환한다.
- Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
- DispatcherServlet이 요청을 처리할 대상을 찾는다.
- HandlerAdapter을 통해 요청을 Controller로 위임한다.
- Controller는 요청을 처리한 후 에 ViewName을 반환한다.
- DispatcherServlet은 ViewResolver를 통해 viewName에 해당하는 View를 찾아 사용자에게 반환한다.
Controller가 반환한 뷰의 이름으로부터 View를 렌더링하기 위해서는 ViewResolver가 사용되며, ViewResolver 설정에 맞게 View를 찾아 렌더링합니다.
[ Controller로 Data 반환하기 ]
하지만 우리는 Spring MVC의 컨트롤러를 사용하면서 Data를 반환해야 하는 경우도 있습니다. 컨트롤러에서는 데이터를 반환하기 위해 @ResponseBody 어노테이션을 활용해주어야 합니다.
이를 통해 Controller도 Json 형태로 데이터를 반환할 수 있습니다.
- Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
- DispatcherServlet이 요청을 처리할 대상을 찾는다.
- HandlerAdapter을 통해 요청을 Controller로 위임한다.
- Controller는 요청을 처리한 후에 객체를 반환한다.
- 반환되는 객체는 Json으로 *Serialize 되어 사용자에게 반환된다.
- *Serialize
- 자바 시스템 내부에서 사용되는 Object 또는 Data를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 데이터를 변환하는 기술
컨트롤러를 통해 객체를 반환할 때에는 일반적으로 ResponseEntity로 감싸서 반환을 합니다. 그리고 객체를 반환하기 위해서는 viewResolver 대신에 HttpMessageConverter가 동작합니다. HttpMessageConverter에는 여러 Converter가 등록되어 있고, 반환해야 하는 데이터에 따라 사용되는 Converter가 달라집니다. 단순 문자열인 경우에는 StringHttpMessageConverter가 사용되고, 객체인 경우에는 MappingJackson2HttpMessageConverter가 사용되며, 데이터 종류에 따라 서로 다른 MessageConverter가 작동하게 됩니다. Spring은 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해 적합한 HttpMessageConverter를 선택하여 이를 처리합니다. MessageConverter가 동작하는 시점은 HandlerAdapter와 Controller가 요청을 주고 받는 시점이다. 그림의 4번에서는 메세지를 객체로, 6번에서는 객체를 메세지로 변환하는데 메세지 컨버터가 사용된다.
[RestController]
@RestController는 @Controller에 @ResponseBody가 추가된 것입니다. 당연하게도 RestController의 주 용도는 Json형태로 객체 데이터를 반환하는 것입니다. 최근에 데이터를 응답으로 제공하는 REST API를 개발할때 주로 사용하며 객체를 ResponseEntity로 감싸서 반환합니다. 이러한 이유로 동작 과정 역시 @Controller에 @ResponseBody를 붙인것과 완벽히 동일합니다.
💡 view가 필요없는 API만 지원하는 서비스에서 사용
@Controller 와 @RestController 의 차이
- @Controller대신 API 서비스로 사용하는 경우는 @ResponseBody를 사용하여 객체를 반환한다.
- view(화면) return이 주목적이다.
- API와 view를 동시에 사용하는 경우에 사용한다.
- @RestControllerSpring 4.0.1부터 제공data(json, xml 등) return이 주목적이다.
- @RequestMapping 메서드가 기본적으로 @ResponseBody 의미를 가정한다.
- view가 필요없는 API만 지원하는 서비스에서 사용한다.
즉, @RestController = @Controller + @ResponseBody 이다.
'Spring🍀 > 개념원리' 카테고리의 다른 글
ID속성 와 NAME 속성 (1) | 2024.04.03 |
---|---|
ORM, JPA, MyBatis (1) | 2024.03.12 |