오늘은 @Controller와 @RestController의 차이점에 대해 알아보겠습니다.
Spring MVC의 @RestController은 @Controller와 @ResponseBody의 조합이다.
Spring 프레임 워크에서 RESTful 웹 서비스를 보다 쉽게 개발할 수 있도록 Spring 4.0에서 추가되었다.
근본적인 차이점은 @Controller의 역할은 Model 객체를 만들어 데이터를 담고 View를 찾는 것이지만, @RestController는 단순히 객체만을 반환하고 객체 데이터는 JSON 또는 XML 형식으로 HTTP 응답에 담아서 전송한다. 물론 @Controller와 @ResponseBody를 사용하여 만들 수 있지만 이러한 방식은 RESTful 웹서비스의 기본 동작이기 때문에 Spring은 @Controller와 @ResponseBody의 동작을 조합한 @RestController을 도입했다.
다음 두 코드는 Spring MVC에서 동일한 동작을 한다.
@Controller
@ResponseBody
public class MVCController{
logic...
}
@RestController
public class ReftFulController{
logic...
}
대부분의 개발자들은 두개의 어노테이션이 아닌 하나의 어노테이션만 선언하고 싶어할 것이다. 또한, @RestController는 이전 두개보다 의미에 대해서 명확히 나타내고 있다.
@Controller은 뷰에 표시될 데이터가 있는 Model 객체를 만들고 올바른 뷰를 선택하는 일을 담당한다. 또한, @ResponseBody를 사용하여 HTTP Response Body에 데이터를 담아 요청을 완료할 수 있다.
HTTP Response Body에 데이터를 담는 것은 RESTful 웹 서비스에 대한 응답에 매우 유용하다. 왜냐하면 뷰를 반환하는 대신 데이터를 반환하기 때문이다.
Spring4 이전에 RESTful 웹 서비스를 개발했다면 @Controller와 @ResponseBody의 조합 사용에 익숙했을 것이다. 하지만 @RestController을 사용하여 동일한 기능을 제공할 수 있다. @Controller와 @ResponsBody의 동작을 하나로 결합한 편의 컨트롤러라 보면 된다.
@Target(value=TYEP)
@Retention(value=RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController
@Target(value=TYEP)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Controller
결론은 RESTful 웹 서비스를 만드는 경우 @Controller + @ResponseBody를 사용하는 것 보다 @RestController을 사용하는 것이 좋다!!