@Controller와 @RestController의 차이점

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