Spring | @Controller와 @RestController

yeonk·2023년 4월 23일
0

spring & spring boot

목록 보기
5/10
post-thumbnail

시작하기 전에


우아한테크코스 레벨2 웹 자동차 경주 미션을 하면서 @Controller@RestController 을 사용했다.
두 어노테이션의 차이가 궁금해져서 공식 문서를 참고하여 정리해보려고 한다.





@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는 무엇이고, 어떤 차이가 있을까?





@Controller


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 the org.springframework.web.bind.annotation.RequestMapping annotation.

  • 해당 어노테이션이 달린 클래스가 "컨트롤러"임을 나타낸다.

  • 그리고 구현체 클래스가 스캐닝을 통해 자동 감지되도록 한다.

  • 일반적으로 @RequestMapping 어노테이션을 기반으로 하는 어노테이션 핸들러 메서드와 함께 사용된다.



정리하자면 @Controller의 특징을 아래와 같이 정리해볼 수 있다.

  • 해당 클래스가 컨트롤러임을 나타낸다.

  • @Component 어노테이션을 포함하기 때문에, 해당 클래스를 스캐닝을 통해 자동으로 감지되도록 하며, 자동으로 빈으로 등록해준다.

  • @GetMapping, @PostMapping 등, @RequestMapping 어노테이션을 기반으로 하는 어노테이션 핸들러 메서드와 함께 사용된다.





@RestController


@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 를 붙이는 것과 같은 효과를 가진다.





참고 자료


1.3. Annotated Controllers

0개의 댓글