본문 바로가기

Spring

❓ @Controller, @RestController 차이점

시작하기 앞서

스프링에서 컨트롤러에 대한 어노테이션은 @Controller@RestController가 있다. 두 어노테이션의 가장 큰 차이점은 전통적인 스프링 MVC 컨트롤러에서 HTTP Response Body 생성 방식에 따라 구분되는데 더 자세히 알아보자.

@Controller(Spring MVC Controller)

그림[1] - @Controller Flow

전통적인 스프링 MVC 컨트롤러 @Controller는 주로 View를 반환하기 위해 사용하며, 그림[1] 같은 과정을 거친다. @Controller는 주로 View를 반환하기 위해 사용하지만, @ResponseBody를 사용하여 객체를 반환 할 수도 있다.

@Controller
public class BasicController {

    @GetMapping("/good")
    public String good() {
        return "good.html";
    }

    @GetMapping("/good2")
    public @ResponseBody Test good2() {
        Test test = new Test();
        test.setContent("good!!");

        return test;
    }
}

 

localhost:8080/good2로 이동해보면 그림[2]와 같은 결과가 나온다.

그림[2] - @ResponseBody 어노테이션이 포함된 메소드에 호출

@ResponseBody

그림[3] - @ResponseBody Flow

@ResponseBody를 사용하면 Spring에서 HTTP 응답에 값을 자동으로 변환해주며, 주로 데이터를 반환하기 위해 사용한다.

@Controller와 다르게 @ResponseBody는 View를 거치지 않고, Controller에서 직접 데이터를 리턴하는 것이 특징이다.

@ResponseBody는 각 메소드 마다 작성해야 하는 번거로움이 있다. 이 문제를 해결하기 위해 @RestController가 등장했는데 @RestController에 대해 한번 알아보자.

@RestController(Spring Restful Controller)

그림[4] - @RestController Flow

@RestController는 4버전에서 도입되어 기존의 @Controller와 @ResponseBody가 결합된 형태(그림[5] - 아래 그림)로 주로 데이터를 반환하기 위해 사용하며, @ResponseBody와 동일한 과정(그림[4] - 위 그림)을 거친다.

그림[5] - @RestController 어노테이션 내부

결론

  • 주로 View를 반환하는지, 데이터를 반환하는지 목적에 따른 차이가 있다.
  • @ControllerView를 거치고, @RestControllerView 거치지 않는 흐름의 차이가 있다.
  • @Controller의 메소드에 @ResponseBody를 붙이면 @RestController의 메소드와 동일하게 작동한다.