@Controller와 @RestController의 차이점

2021. 2. 12. 16:23·Tech/Spring

1.개요

Spring MVC의 @RestController은 @Controller와 @ResponseBody의 조합입니다.

Spring 프레임 워크에서 RESTful 웹 서비스를 보다 쉽게 개발할 수 있도록 Spring 4.0에서 추가되었습니다.

 

근본적인 차이점은 @Controller의 역할은 Model 객체를 만들어 데이터를 담고 View를 찾는 것이지만, @RestController는 단순히 객체만을 반환하고 객체 데이터는 JSON 또는 XML 형식으로 HTTP 응답에 담아서 전송합니다. 물론 @Controller와 @ResponseBody를 사용하여 만들 수 있지만 이러한 방식은 RESTful 웹서비스의 기본 동작이기 때문에 Spring은 @Controller와 @ResponseBody의 동작을 조합한 @RestController을 도입했습니다.

 

다음 두 코드는 Spring MVC에서 동일한 동작을 합니다.

@Controller
@ResponseBody
public class MVCController{
	logic...
}

@RestController
public class ReftFulController{
	logic...
}

대부분의 개발자들은 두개의 어노테이션이 아닌 하나의 어노테이션만 선언하고 싶어할 것입니다. 또한, @RestController는 이전 두개보다 의미에 대해서 명확히 나타내고 있습니다.

 

2. Spring에서 @Controller와 @RestController은 무엇인가?

@Controller은 뷰에 표시될 데이터가 있는 Model 객체를 만들고 올바른 뷰를 선택하는 일을 담당합니다. 또한, @ResponseBody를 사용하여 HTTP Response Body에 데이터를 담아 요청을 완료할 수 있습니다.

 

HTTP Response Body에 데이터를 담는 것은 RESTful 웹 서비스에 대한 응답에 매우 유용합니다. 왜냐하면 뷰를 반환하는 대신 데이터를 반환하기 때문입니다.

 

Spring4 이전에 RESTful 웹 서비스를 개발했다면 @Controller와 @ResponseBody의 조합 사용에 익숙했을 것입니다. 하지만 @RestController을 사용하여 동일한 기능을 제공할 수 있습니다. 요컨대 @Controller와 @ResponsBody의 동작을 하나로 결합한 편의 컨트롤러라 보시면 됩니다.

 

3. Spring에서 @RestController와 @Controller의 차이점

 

1. @Controller는 클래스를 Spring MVC 컨트롤러로 표시하는데 사용되며, @RestController는 RESTful 웹 서비스에서 사용되는 특수 컨트롤러이며 @Controller + @ResponseBody와 동일합니다.

 

2. @RestController는 Spring4.0에서 추가되었지만, @Controller는 Spring이 주석을 지원하기 시작한 이후에 존재하며 공식적으로 Spring 2.5버전에서 추가되었습니다.

 

3. @Controller는 @Component 주석이 달려있고, @RestController는 아래와 같이 @Controller와 @ResponseBody 주석이 달린 편의 컨트롤러입니다.

 

@Target(value=TYEP)
@Retention(value=RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController
@Target(value=TYEP)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Controller

4. @Controller와 @RestController의 주요 차이점 중 하나는 @RestController을 표시하면 모든 메소드가 뷰 대신 객체로 작성됩니다.

 

※ 일반적인 Spring MVC 처리과정

www.facebook.com/photo/?fbid=1873079892846068&set=gm.3389524044492534

6. 제가 생각하는 가장큰 차이점은 위에서 설명했다 싶이, @RestController을 클래스에 달면 모든 핸들러 메소드에서 @ResponseBody를 사용할 필요가 없다는 것입니다.

 

@Controller
@RequestMapping("books")
public class SimpleBookController {

    @GetMapping("/{id}", produces = "application/json")
    public @ResponseBody Book getBook(@PathVariable int id) {
        return findBookById(id);
    }

    private Book findBookById(int id) {
        // ...
    }
}
@RestController
@RequestMapping("books-rest")
public class SimpleBookRestController {
    
    @GetMapping("/{id}", produces = "application/json")
    public Book getBook(@PathVariable int id) {
        return findBookById(id);
    }

    private Book findBookById(int id) {
        // ...
    }
}

 

추가적으로, 스프링부트는 기본적으로 JSON으로 매핑해서 내려주지만 요청의 MIME유형에 따라 XML로 내려줘야 할 경우 추가적인 작업이 필요합니다. 자세한건 아래링크를 확인하시길 바랍니다.

gompangs.tistory.com/m/entry/Spring-spring-boot-XML-Response-%EB%A7%A4%ED%95%91?category=537220

 

[Spring] spring boot XML Response 매핑

Springboot에서 @RestController로 내려주는 Value에 대해서는 JSON 매핑을 알아서 변형해서 내려주지만, XML은 기본적으로 매핑되지 않아서 내려주지 않는다 (Accept : application/xml로 요청 왔을 시 -> 406 No..

gompangs.tistory.com

결론은 REStful 웹 서비스를 만드는 경우 @Controller + @ResponseBody를 사용하는 것 보다 @RestController을 사용하는 것이 좋습니다.

 

참고

javarevisited.blogspot.com/2017/08/difference-between-restcontroller-and-controller-annotations-spring-mvc-rest.html#axzz6mEi9cIpR

www.baeldung.com/spring-controller-vs-restcontroller

저작자표시 (새창열림)

'Tech > Spring' 카테고리의 다른 글

Spring Boot Validation 순서 정하기 & 테스트 코드  (5) 2021.03.15
SpringBoot에서 HttpOnly 쿠키방식을 이용한 refreshToken 발급  (0) 2021.02.27
[취준생을 위한 스프링부트 백엔드 프로그래밍] 3주차 과제  (0) 2021.01.26
[취준생을 위한 스프링부트 백엔드 프로그래밍] 2주차 과제  (0) 2021.01.21
[취준생을 위한 스프링부트 백엔드 프로그래밍] 1주차 과제  (0) 2021.01.10
'Tech/Spring' 카테고리의 다른 글
  • Spring Boot Validation 순서 정하기 & 테스트 코드
  • SpringBoot에서 HttpOnly 쿠키방식을 이용한 refreshToken 발급
  • [취준생을 위한 스프링부트 백엔드 프로그래밍] 3주차 과제
  • [취준생을 위한 스프링부트 백엔드 프로그래밍] 2주차 과제
소프
소프
  • 소프
    기회는 찬스
    소프
  • 전체
    오늘
    어제
    • 분류 전체보기 (138) N
      • Language (20)
        • Java (19)
        • Design Pattern (1)
      • Tech (27)
        • Spring (19)
        • JPA (3)
        • QueryDSL (1)
        • Gradle (4)
      • 개발 생각 (1)
      • IT Book (0)
        • 자바_스프링 개발자를 위한 실용주의 프로그래밍 (0)
      • Database (4)
        • Mysql (4)
        • Redis (0)
      • 네트워크 (1)
      • 운영체제 (2)
      • IDE (12)
        • Intellij (9)
        • vscode (2)
        • datagrip (1)
      • 인프라 (11)
        • Docker (2)
        • Jenkins (7)
        • Github Actions (1)
        • GCP (1)
      • 형상관리 (2)
        • gitlab (2)
        • git (0)
      • 외부활동 (44)
        • CS 면접 끝장내기 - 데이터베이스 1기 (5)
        • CS 면접 끝장내기 - 컴퓨터 네트워크 2기 (5)
        • CS 면접 끝장내기 - 자바 2기 (0)
        • TDD, 클린 코드 with Java 17기 (7)
        • ATDD, 클린 코드 with Spring 8기 (6)
        • 루퍼스 2기 (21)
      • 프로젝트 (0)
      • 회고 (6)
      • 기타 (1)
        • 제미니의 개발 실무 (0)
  • 블로그 메뉴

    • 홈
    • Github
    • LinkedIn
    • 방명록
  • 인기 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.6
소프
@Controller와 @RestController의 차이점
상단으로

티스토리툴바