Spring-Boot

[Spring-Boot] @Controller vs @RestContoller 차이점

뚜코맨 2024. 1. 23. 17:10

 

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

 

이번에는 이 2가지 어노테이션의 차이점에 대해 정리해보겠다.

 

주요 차이점은 @ResponseBody가 생성되는 방식. 즉, @Controller + @ResponseBody 조합 = @RestContoller 이다.

 

@Controller

 

전통적인 Spring MVC의 컨트롤러 어노테이션인 @Controller는 주로 View(화면)를 반환하기 위해 사용됨.

 

아래와 같은 요청으로 view를 반환하게 됨.

 

  1. Client는 URL 형식으로 요청을 보냄.
  2. DispatcherServlet이 요청을 위임할 Handler Mapping을 찾음.
  3. Handler Mapping을 통해 해당 요청을 받는 Controller로 위임.
  4. Controller는 요청을 처리 한 후에 View Name을 Handler Adapter에게 반환함.
  5. Handler Adapter는 View Name을 DispatcherServlet에게 반환.
  6. DispatcherServletsms View Resolver를 통해 View Name에 해당하는 View를 찾아서 Client에게 반환.

위의 과정을 거치면서 View를 찾아서 렌더링을 하게 된다.

 

하지만 Spring MVC의 컨트롤러를 사용할 때 View가 아닌 Data를 반환해야 하는 경우가 있다.

 

컨트롤러에서 Data를 반환하기 위해 @ResponseBody 어노테이션을 사용해서 JSON 형태로 반환할 수 있다.

 

 

이런식으로 반환 타입을 HelloData 형으로 지정하고 @ResponseBody 어노테이션을 활용하여 return data; 로 HelloData를 JSON 형태로 데이터를 반환할 수 있다.

  1. Client는 URL형식으로 요청을 보낸다.
  2. DispatcherServlet이 요청을 위임할 Handler Mapping을 찾는다.
  3. Handler Mapping을 통해 요청을 Controller로 위임한다.
  4. Controller는 요청을 처리한 후 객체를 반환한다.
  5. 반환되는 객체는 JSON으로 직렬화(Serialize)돼서 Client에게 반환된다.

 

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

그리고 객체를 반환하기 위해서는 View를 반환할 때 사용했던 View Resolver 대신에 HttpMessageConverter가 동작한다.

HttpMessageConverter에는 여러 Converter가 등록되어 있고, 반환하는 데이터의 타입에 따라 사용하는 Converter가 달라진다.

 

단순 문자열일 경우 SpringHttpMessageConverter가 사용되고,

객체인 경우엔 MappingJackson2HttpMessageConverter를 사용한다.

 

상단 그림을 보면 4번에서 Message를 객체로 변환, 6번에서는 객체를 Message로 변환하는데 Message Converter가 사용 된다.

 

@RestContoller?

@RestController는 Restful Web Service에서 사용되는 컨트롤러 어노테이션이다.

@Controller + @ResponseBody가 합쳐진 형태로 JSON 형태의 객체로 데이터를 반환한다.

 

실제로 @RestController에 들어가 보면 @Controller와 @ResponseBody가 같이 합쳐져있는 것을 볼 수 있다.

@RestController라고 해서 완전히 다른 기능을 사용해서 처리하는 것이 아니라, 그냥 단지 사용자가 간편하게 사용할 수 있게끔

스프링에서 @RestController라고 따로 어노테이션을 제공하는 것 뿐이지 사실 @Controller와 @ResponseBody의 기능을 합쳐놓은 것 뿐이다.

 

 

이렇게 데이터를 보내면 return을 JSON 형태로 해주는 걸 볼 수 있다.

 

결론

@Controller와 @RestController의 차이점은 용도의 차이라고 말할 수 있겠다.


@Controller 어노테이션은 공식적으로 Spring 2.5 버전에서 추가되었고, 

@RestController는 Spring 4.0 버전에서 추가 되었다.


과거에는 JSP, HTML과 같은 View를 전달해 주었기에 주로 @Controller를 사용했고

최근에는 Frontend / Backend을 나누어 개발하는 경우가 많기에 Backend에서 Rest API를 통해 JSON으로 데이터만 전달하기 때문에 편리성을 위해 @RestController를 사용하는 경우가 많다.