본문 바로가기

Spring

[Spring] @RestController

Spring에서 Controller를 지정해주기 위한 어노테이션으로 @Controller와 @RestController가 있다.

두 어노테이션의 주요한 차이점은 HTTP Response Body가 생성되는 방식이다.

 

1. @Controller

1-1. [View 반환하기]

 

@Controller는 주로 View를 반환하기 위해 사용한다.

 

 1) Client는 URL 형식으로 웹 서비스에 요청을 보낸다.

 2) DispatcherServlet이 요청을 위임할 HandlerMapping을 찾는다.

 3) HandlerMapping을 통해 요청을 Controller로 위임한다.

 4) Controller는 요청을 처리한 후 ViewName을 반환한다.

 5) DispatcherServlet은 ViewResolver를 통해 ViewName에 해당하는 View를 찾아 사용자에게 반환한다.

 

1-2. [데이터 반환하기]

 

컨트롤러에서 데이터를 반환하기 위해선 @ResponseBody 어노테이션을 활용해야 한다. 이를 통해 Json형태로 데이터를 반환할 수 있다.

 

 1) Client는 URL 형식으로 웹 서비스에 요청을 보낸다.

 2) DispatcherServlet이 요청을 위임할 HandlerMapping을 찾는다.

 3) HandlerMapping을 통해 요청을 Controller로 위임한다.

 4) Controller는 요청을 처리한 후에 객체를 반환한다.

 5) 반환되는 객체는 Json으로 사용자에게 반환된다.

 

컨트롤러를 통해 객체를 반환할 때 일반적으로 ResponseEntity로 감싸서 반환을 한다.

그리고 View를 반환할 때는 viewResolver가 동작하지만 객체를 반환할 땐 HttpMessageConverter가 동작한다고 한다. Spring은 클라이언트의 Http Accpt 헤더와 서버의 컨트롤러 반환 타입 정보를 조합해 적합한 HttpMessageConverter를 선택해 처리한다. HttpMessageConverter가 동작하는 시점은 HandlerAdapter와 Controller가 요청을 주고 받는 시점이다.

 

2. @RestController

 2-1. [RestController]

 

@RestController는 @Controller에 @ResponseBody가 추가된 것이다. RestController의 주 용도는 Json 형태로 객체 데이터를 반환하는 것이다. 데이터를 응답으로 제공하는 Rest API를 개발할 때 주로 사용하며 ResponseEntity로 감싸서 반환한다.

 

 1) Client는 URL 형식으로 웹 서비스에 요청을 보낸다.

 2) DispatcherServlet이 요청을 위임할 HandlerMapping을 찾는다.

 3) HandlerMapping을 통해 요청을 Controller로 위임한다.

 4) Controller는 요청을 처리한 후에 객체를 반환한다.

 5) 반환되는 객체는 Json으로 사용자에게 반환된다.

 

객체를 상황에 맞는 ResponseEntity로 감싸서 반환해주어야 한다.