본문 바로가기

개발/SpringBoot

[SpringBoot] @Controller, @RestController의 차이

이제까지 스프링부트로 강의를 보며 연습(?) 개발을 했을 때는,

강의 예제로 제공되는 jsp 파일을 받아와서 Controller을 이용해 View를 반환하는 방식으로 개발을 진행했었다. 

 

그런데 이번 백엔드 프로젝트를 진행할 때는 프론트 개발자가 따로 없어서, "그럼 뷰는 어떻게 해요? jsp 나 타임리프같은 템플릿 엔진 만들어진거 같은거라도 있어야 하지 않을까요" 라고 질문했더니 (막연히 부트스트랩 같은 사이트처럼 자바 템플릿을 제공해주는 사이트가 있지 않을까 하고 생각했음..) 팀장님께서 "Rest 쓰면 되지 않을까요" 라고 하셨다. RestController은 ResponseBody와 Controller을 합쳐놓은 것이라고만 막연하게 알고 있었는데, 이번 기회에 좀 더 자세히 알아보고자 한다. 


 

서버에서 클라이언트와 HTTP 통신을 하며 응답을 전송할 때, 자바 객체에서 데이터를 JSON 형태로 뽑아 응답을 보낼 수 있도록 하는게 @ResponseBody 이다. RestController은 해당 컨트롤러의 모든 핸들러 메서드가 데이터를 HTTP 응답 바디에 직접 쓰도록 해주는 것으로, 즉 RestController에는 ResponseBody가 기본적으로 활성화 되어있는 것이다. 코드로 보자면 다음과 같다.

@Controller
public class RestClassName{

  @RequestMapping(value={"/uri"})
  @ResponseBody
  public ObjectResponse functionRestName(){
      //...
      return instance;
   }
}

 

@RestController
public class RestClassName{

  @RequestMapping(value={"/uri"})
  public ObjectResponse functionRestName(){
      //...
      return instance;
   }
}

 


그럼 이게 view의 유무와는 어떤 관계가 있을까? 일반적인 Controller은 클라이언트의 요청이 들어왔을 때, View Resolver을 사용해 요청된 view의 이름에 해당하는 실제 뷰 파일을 찾고 렌더링한다. 그 후 데이터와 view를 결합해서 HTML 페이지를 생성해 클라이언트에게 반환하는 것이다. 

 

그러나 RestController은 뷰를 생성하거나 렌더링 하는 대신 JSON, XML과 같은 데이터 형식을 직접 반환하여 클라이언트에서 처리하도록 한다. 

 

@Controller은 Spring 2.5버전에서 추가되었고, @RestController은 Spring 4.0 버전에서 추가되었다고 한다. 과거에는 @Controller을 주로 사용하였지만 최근에는 프론트/백으로 나눠서 개발하는 경우가 많기 때문에, REST API를 이용해 JSON으로만 데이터를 전달하기 위해 백에서는 @RestController을 이용해 개발한다고 한다.


출처

https://stackoverflow.com/questions/25242321/difference-between-spring-controller-and-restcontroller-annotation

 

Difference between spring @Controller and @RestController annotation

Difference between spring @Controller and @RestController annotation. Can @Controller annotation be used for both Web MVC and REST applications? If yes, how can we differentiate if it is Web MVC o...

stackoverflow.com

https://spring.io/guides/gs/rest-service

 

Getting Started | Building a RESTful Web Service

In Spring’s approach to building RESTful web services, HTTP requests are handled by a controller. These components are identified by the @RestController annotation, and the GreetingController shown in the following listing (from src/main/java/com/example

spring.io

https://backendcode.tistory.com/213

 

@Controller와 @RestController 차이점

서론 Spring에서 클래스에 컨트롤러를 지정해주기 위한 어노테이션은 @Controller와 @RestController가 있습니다. 이번에는 이 2가지 어노테이션의 차이점에 대해 정리할 것입니다. 이 2가지의 주요 차이

backendcode.tistory.com