아직은 정체성이 없는 블로그

[Spring] @Controller와 @RestController의 차이 본문

Spring

[Spring] @Controller와 @RestController의 차이

coooding 2020. 7. 20. 23:48

Spring을 처음 사용해볼 때 @Controller@RestController의 차이점도 정확히 모르고 둘이 헷갈려 사용을 제대로 못해 제가 원하는 View를 보여주지 못했던 기억이 있습니다.

 

오늘은 Spring MVC에서 자주 쓰게 되는 @Controller@RestController의 차이점을 알아보겠습니다.

 

 

@Controller@RestController의 차이

 

Spring에서 컨트롤러를 지정해주기 위한 어노테이션은 @Controller@RestController가 있습니다.

전통적인 Spring MVC의 컨트롤러인 @ControllerRestuful 웹서비스의 컨트롤러인 @RestController의 주요한 차이점은 HTTP Response Body가 생성되는 방식입니다.

 

좀 더 쉽게 말하자면 @Controller의 주용도는 View를 리턴하는 것이고, @RestControllerJSON/XML 타입의 HTTP 응답을 직접 리턴합니다.

 

2가지의 어노테이션을 아래에서 간단히 설명해드리겠습니다.

 

1. @Controller(Spring MVC Controller)

Controller에서 View 반환하는 경우

 

전통적인 Spring MVC의 컨트롤러인 @Controller는 주로 View를 반환하기 위해 사용합니다. 아래와 같은 과정을 통해 Spring MVC ContainerClient의 요청으로부터 View를 반환합니다.

 

1.ClientURI 형식으로 웹 서비스에 요청을 보낸다.

2.Mapping되는 Handler와 그 Type을 찾는 DispatcherServlet이 요청을 인터셉트한다.

3.Controller가 요청을 처리한 후에 응답을 DispatcherServlet으로 반환하고, DispatcherServletView를 사용자에게 반환한다.

 

Client -> Request -> Dispatcher Servlet -> Handler Mapping -> Controller -> View -> Dispatcher Servlet -> Response -> Client

 

 

Data를 반환할 때

 

Spring MVC ControllerView 만 반환하지 않습니다. Data를 반환해야 하는 경우가 있는데 이럴 때에는ResponseBody 어노테이션을 활용하여 Json형태로 데이터를 반환할 수 있습니다.

 

1.ClientURI 형식으로 웹 서비스에 요청을 보낸다.

2.Mapping되는 Handler와 그 Type을 찾는 DispatcherServlet이 요청을 인터셉트한다.

3.@ResponseBody를 사용하여 Client에게 Json 형태로 데이터를 반환한다.

 

Client -> Request -> Dispatcher Servlet -> Handler Mapping -> Controller (ResponseBody)-> Response -> Client

 

 

2. @RestController(Spring Restful Controller)

 

@RestControllerSpring MVC Controller@ResponseBody가 추가된 것입니다. 클래스 상단에 @RestController 어노테이션을 선언하면 Method마다 @ResponseBody를 붙여 주지 않아도 됩니다.

RestController의 주용도는 Json/Xml 형태로 객체 데이터를 반환하는 것입니다.

 

 

1.ClientURI 형식으로 웹 서비스에 요청을 보낸다.

2.Mapping되는 Handler와 그 Type을 찾는 DispatcherServlet이 요청을 인터셉트한다.

3.RestController는 해당 요청을 처리하고 데이터를 반환한다.

 

Client -> HTTP Request -> Dispatcher Servlet -> Handler Mapping -> RestController (자동 ResponseBody 추가)-> HTTP Response -> Client

 

 

참고한 자료

https://mangkyu.tistory.com/49

https://www.genuitec.com/spring-frameworkrestcontroller-vs-controller/

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RestController.html

Comments