시작하기 앞서
스프링에서 컨트롤러에 대한 어노테이션은 @Controller와 @RestController가 있다. 두 어노테이션의 가장 큰 차이점은 전통적인 스프링 MVC 컨트롤러에서 HTTP Response Body 생성 방식에 따라 구분되는데 더 자세히 알아보자.
@Controller(Spring MVC Controller)
전통적인 스프링 MVC 컨트롤러 @Controller는 주로 View를 반환하기 위해 사용하며, 그림[1] 같은 과정을 거친다. @Controller는 주로 View를 반환하기 위해 사용하지만, @ResponseBody를 사용하여 객체를 반환 할 수도 있다.
@Controller
public class BasicController {
@GetMapping("/good")
public String good() {
return "good.html";
}
@GetMapping("/good2")
public @ResponseBody Test good2() {
Test test = new Test();
test.setContent("good!!");
return test;
}
}
localhost:8080/good2로 이동해보면 그림[2]와 같은 결과가 나온다.
@ResponseBody
@ResponseBody를 사용하면 Spring에서 HTTP 응답에 값을 자동으로 변환해주며, 주로 데이터를 반환하기 위해 사용한다.
@Controller와 다르게 @ResponseBody는 View를 거치지 않고, Controller에서 직접 데이터를 리턴하는 것이 특징이다.
@ResponseBody는 각 메소드 마다 작성해야 하는 번거로움이 있다. 이 문제를 해결하기 위해 @RestController가 등장했는데 @RestController에 대해 한번 알아보자.
@RestController(Spring Restful Controller)
@RestController는 4버전에서 도입되어 기존의 @Controller와 @ResponseBody가 결합된 형태(그림[5] - 아래 그림)로 주로 데이터를 반환하기 위해 사용하며, @ResponseBody와 동일한 과정(그림[4] - 위 그림)을 거친다.
결론
- 주로 View를 반환하는지, 데이터를 반환하는지 목적에 따른 차이가 있다.
- @Controller는 View를 거치고, @RestController는 View 거치지 않는 흐름의 차이가 있다.
- @Controller의 메소드에 @ResponseBody를 붙이면 @RestController의 메소드와 동일하게 작동한다.
'Spring' 카테고리의 다른 글
🤔 @RequestBody - DTO, Map 무엇을 선택할까? (0) | 2020.11.18 |
---|---|
🤔 @Component, @Bean, @Configuration 차이는 무엇일까? (0) | 2020.11.15 |
👨🏻💻 Undertow 적용하기 (다른 WAS 적용해보기) (0) | 2020.11.10 |
⏰ WebTestClient Timeout (0) | 2020.03.20 |
👐 OSIV(Open Session In View) (0) | 2020.03.20 |