본문 바로가기

DEVELOPER/Spring & JPA

[스프링] @Controller와 @RestController의 차이를 알고 있나요?

안녕하세요😎 백엔드 개발자 제임스입니다 :)

스프링 프레임워크를 사용하여 개발을 한다면, @Controller와 @RestController를 빈번하게 사용하게 됩니다. 가령 프론트엔드 개발자들과 협업을 하기 위해 API를 개발한다면, @RestContoller를 많이 접할 것입니다. 그렇다면 두 어노테이션의 차이를 알고 계신가요? 오늘은 두 어노테이션의 차이에 대해서 알아보도록 하겠습니다.

(좌) @Controller와 (우) @RestController


@Controller와 @RestContoller는 무엇인가요?

간단하게 @Controller와 @RestController에 대해서 알아보도록 하겠습니다. 두 어노테이션은 스프링에서 컨틀로러 역할을 수행할 객체에 지정해 주는 어노테이션입니다. 먼저 @Controller는 주로 Spring MVC 컨트롤러에 지정합니다. 반면 @RestController는 Restful 웹 서비스 또는 API 통신을 위해 사용합니다.

두 어노테이션의 결정적인 차이점은 HTTP Response Body가 생성되는 방식입니다.


@Controller 의 역할

전통적인 Spring MVC 의 컨트롤러인 @Controller는 주로 View를 반환하기 위해 사용합니다. 즉, MVC 디자인 패턴에 따라 컨트롤러의 역할인 클라이언트에게 전달할 적절한 뷰를 선택하는 역할을 수행합니다. 동작 방식은 아래 도식과 같습니다.

View 반환 과정

1. 약속된 URI를 통해 서버에 Request를 보냅니다.
2. DispatcherServlet이 요청을 위임할 HandlerMapping을 찾습니다.
3. HandlerMapping은 해당 URI와 매칭되는 Controller를 찾습니다. 그리고 다시 DispathcherServlet으로 찾은 Controller에 대한 정보를 보냅니다.
4. 정보를 받은 DisPatcherServlet은 HandlerAdapter에게 요청을 위임합니다.
5. HandlerAdapter가 Controller에게 요청을 전달합니다.
6. Controller는 비즈니스 로직을 통해 데이터를 처리하고 그에 대한 결과와 ViewName을 Handler Adapter로 반환합니다.
7. Handler Adapter는 이 결과를 ModelAndView()에 담아서 다시 DispatcherServlet으로 반환합니다.
8. DispatcherServlet은 ViewResolver를 통해 ViewName 에 해당하는 View 가 있는지 체크합니다.
9. 결과를 확인했으면, ViewName에 맞는 View를 찾아서 Client에게 전달합니다.

데이터 반환 과정

Spring MVC에서 데이터를 전달하기 위해선, 컨트롤러에서 Model 타입의 객체를 파라미터로 받은 후 View로 전달할 수 있습니다. 이 외에도 데이터를 Json, XML 형태로 클라이언트에게 전달해야 하는 경우가 있습니다. 가령 비동기 방식 처리나 API 방식으로 기능을 수행해야 할 경우가 있습니다. 그러한 경우엔 아래 그림과 같이 과정을 수행합니다.

이 경우에는 @ResponseBody 어노테이션을 사용하여 HTTP Response Body에 데이터를 담아서 전송합니다. 그림을 보다시피, View 대신 ResponseEntity 타입의 객체를 반환하는 것을 알 수 있습니다. (해당 과정에서는 ViewResolver가 아닌 HttpMessageConverter가 동작합니다.)

아래 이미지는 직접 @Controller 어노테이션을 적용한 컨트롤러 개발할 때 예시입니다. 이 외에는 view를 반환했었는데요. 아래와 같은 기능에서 특별하게 Http API 형태로 데이터를 주고받아야 했습니다. 따라서 메서드에 @ResponseBody를 선언하고, @RequestBody를 통해 요청 데이터를 받은 후 ResponseEntity 타입으로 반환하는 것을 볼 수 있습니다.

ResponseEntity 란?
HtTP Spring Framework에서 제공하는 클래스인 HttpEntity를 상속받아 구현한 HTTP 응답을 위한 클래스입니다. 따라서 해당 클래스는 Http 메시지의 구성인 HttpStatus, HttpHeaders, HttpBody를 포함합니다.

@RestController 의 역할

요약 : @RestController는 @Controller와 @ResponseBody를 결합한 형태입니다.

@RestController는 RESTful 웹 서비스를 쉽게 개발하도록 돕기 위해 제공되었습니다. 위에 @Controller에서 데이터를 반환하는 방법에서 @ResponseBody 애너테이션을 사용하는 예시를 봤습니다. 아래 소스코드를 보면 알 수 있겠지만, @RestController 어노테이션이 사용된 클래스에서는 @ResponseBody를 사용하지 않았습니다. 즉, 어노테이션을 사용하지 않더라도 Json 형태로 응답할 수 있게 됩니다.

반응형