개발/Spring Boot Framework

@Controller와 @RestController 차이점

펭귀니 :) 2021. 6. 3. 20:20

🗣️ 간단하게 말하자면,

@Controller는 view를 반환하고, @RestController는 Json 형식의 HTTP 응답을 직접 반환한다.

따라서 서버의 목적에 따라 골라서 사용하면 되겠다.

@Controller는 웹서버에서 사용하기 적당해보이고, @RestController는 API 서버에서 사용하기 적당해보인다.

❓웹서버랑 API 서버의 차이는?

웹서버는 jsp등의 브라우저가 읽을 페이지를 반환하는 서버이고,

API 서버는 웹서버가 따로 있는 경우, 혹은 Server to Server로 통신하는 경우 json등의 포맷으로 값을 전달하는 서버이다.

📄@Controller의 Document를 확인하면 아래와 같다.

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.

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {

    /**
     * The value may indicate a suggestion for a logical component name,
     * to be turned into a Spring bean in case of an autodetected component.
     * @return the suggested component name, if any (or empty String otherwise)
     */
    @AliasFor(annotation = Component.class)
    String value() default "";

}

이 어노테이션이 달린 클래스는 "컨트롤러"(예: 웹 컨트롤러)임을 나타냅니다.
이 어노테이션은 클래스 경로 검색을 통해 구현 클래스를 자동으로 검색할 수 있는 @Component의 일부 역할을 합니다.
일반적으로 org.springframework.web.bind.anotation.RequestMapping 어노테이션에 기반한 handler methods와 함께 사용됩니다.

📄@RestController의 Document를 확인하면 아래와 같다.

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. 
NOTE: @RestController is processed if an appropriate HandlerMapping-HandlerAdapter pair is configured such as the RequestMappingHandlerMapping-RequestMappingHandlerAdapter pair which are the default in the MVC Java config and the MVC namespace.

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {

    /**
     * The value may indicate a suggestion for a logical component name,
     * to be turned into a Spring bean in case of an autodetected component.
     * @return the suggested component name, if any (or empty String otherwise)
     * @since 4.0.1
     */
    @AliasFor(annotation = Controller.class)
    String value() default "";

}

@Controller과 @ResponseBody를 포함한 편리한 어노테이션입니다.
이 어노테이션을 사용하는 유형은 기본적으로 @RequestMapping 메소드가 @ResponseBody 의미를 취하는 controller로 간주됩니다.
참고: @RestController는 MVC Java 구성 및 MVC 네임스페이스의 기본값인 RequestMappingHandlerMapping-RequestMappingHandlerAdapter pair와 같이 적절한 HandlerMapping-HandlerAdapter pair로 구성된 경우 @RestController가 처리됩니다.

😕@Controller를 @RestController처럼 사용하기

@RestController는 결국 @Controller + @ResponseBody니까
@Controller 어노테이션과 @ResponseBody 어노테이션 두 개 다 작성해주면 View가 아닌 Json형식의 response값을 반환할 수 있다.

'개발 > Spring Boot Framework' 카테고리의 다른 글

spring boot에서 euc-kr 요청 받기  (0) 2023.10.12
웹 애플리케이션 컨테이너  (0) 2019.12.18
Spring, Spring Boot란?  (0) 2019.12.11