우아한테크코스 레벨2 웹 자동차 경주 미션을 하면서 @Controller
와 @RestController
을 사용했다.
두 어노테이션의 차이가 궁금해져서 공식 문서를 참고하여 정리해보려고 한다.
Spring MVC provides an annotation-based programming model where @Controller and @RestController components use annotations to express request mappings, request input, exception handling, and more. Annotated controllers have flexible method signatures and do not have to extend base classes nor implement specific interfaces.
공식 문서에 따르면, Spring MVC는 어노테이션 기반 프로그래밍 모델을 제공하고,@Controller
와 @RestController
어노테이션을 사용하여 요청 매핑, 요청 입력, 예외 처리 등을 표현한다.
이 때, 어노테이션을 사용한 컨트롤러들은 유연한 메서드 시그니처를 가지고, 베이스 클래스를 확장하거나 특정 인터페이스를 구현할 필요가 없다고 한다.
그렇다면 @Controller
와 @RestController
는 무엇이고, 어떤 차이가 있을까?
The
@Controller
stereotype allows for auto-detection, aligned with Spring general support for detecting@Component
classes in the classpath and auto-registering bean definitions for them.
It also acts as a stereotype for the annotated class, indicating its role as a web component.
스프링은 @Component
를 붙인 클래스를 검색하고 자동으로 빈으로 등록해주고, @Controller
도 이에 포함된다.
@Controller
어노테이션이 어떻게 구현되어있는지 확인해보면, @Component
어노테이션이 포함되어 있는 것을 확인할 수 있다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
@AliasFor(annotation = Component.class)
String value() default "";
}
구현 코드와 함께 작성된 주석을 통해 조금 더 알아보자.
Indicates that an annotated class is a "Controller" (e.g. a web controller).
This annotation serves as a specialization of@Component
, allowing for implementation classes to be autodetected through classpath scanning.
It is typically used in combination with annotated handler methods based on theorg.springframework.web.bind.annotation.RequestMapping
annotation.
해당 어노테이션이 달린 클래스가 "컨트롤러"임을 나타낸다.
그리고 구현체 클래스가 스캐닝을 통해 자동 감지되도록 한다.
일반적으로 @RequestMapping
어노테이션을 기반으로 하는 어노테이션 핸들러 메서드와 함께 사용된다.
정리하자면 @Controller
의 특징을 아래와 같이 정리해볼 수 있다.
해당 클래스가 컨트롤러임을 나타낸다.
@Component
어노테이션을 포함하기 때문에, 해당 클래스를 스캐닝을 통해 자동으로 감지되도록 하며, 자동으로 빈으로 등록해준다.
@GetMapping
, @PostMapping
등, @RequestMapping
어노테이션을 기반으로 하는 어노테이션 핸들러 메서드와 함께 사용된다.
@RestController
is a composed annotation that is itself meta-annotated with@Controller
and@ResponseBody
to indicate a controller whose every method inherits the type-level@ResponseBody
annotation and, therefore, writes directly to the response body versus view resolution and rendering with an HTML template.
@RestController
는 @Controller
와 @ResponseBody
로 메타 어노테이션된 구성 어노테이션이다.
모든 메서드가 @ResponseBody
어노테이션을 상속하는 컨트롤러임을 나타낸다.
@RestController
어노테이션이 어떻게 구현되어있는지 확인해보면, @Controller
와 @ResponseBody
어노테이션이 포함되어 있는 것을 확인할 수 있다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
@AliasFor(annotation = Controller.class)
String value() default "";
}
구현 코드와 함께 작성된 주석을 통해 조금 더 알아보자.
A convenience annotation that is itself annotated with
@Controller
and@ResponseBody
.
Types that carry this annotation are treated as controllers where@RequestMapping
methods assume@ResponseBody
semantics by default.
@RestController
는 @Controller
와 @ResponseBody
애너테이션을 를 가지는 편의용 애너테이션이다.
해당 애너테이션을 가지면 @RequestMapping
메서드가 기본적으로 @ResponseBody
의미를 가지는 컨트롤러로 취급된다.
정리하자면 @RestController
의 특징을 아래와 같이 정리해볼 수 있다.
해당 클래스가 컨트롤러임을 나타낸다.
해당 애너테이션을 가지면 @RequestMapping
메서드에 @ResponseBody
를 붙이는 것과 같은 효과를 가진다.