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 처리과정
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
결론은 REStful 웹 서비스를 만드는 경우 @Controller + @ResponseBody를 사용하는 것 보다 @RestController을 사용하는 것이 좋습니다.
참고
'Tech > Spring' 카테고리의 다른 글
Spring Boot Validation 순서 정하기 & 테스트 코드 (4) | 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 |