[Spring] @Controller와 @RestController의 차이점
스프링은 해당 클래스가 컨트롤러 클래스임을 명시하기 위해 다음 어노테이션을 제공합니다.
- @Controller
- @RestController
위 두 어노테이션의 차이점과 사용법에 대해 알아보겠습니다.
| @Controller
스프링 MVC 프로젝트에서는 일반적으로 JSP, Thymeleaf, Freemarker 같은 기술을 이용해 View을 표시하는데 사용됩니다.
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
}
이 경우 컨트롤러 메서드에서 모델이 생성되고 ViewResolver가 동작해 매핑되는 논리적인 View 이름이 반환됩니다.
하지만 개발을 진행하다 보면 컨트롤러에서 화면이 아닌 데이터를 반환해야 하는 경우도 있기 마련입니다.
@Controller
@ReponseBody
public class HelloController {
...
}
이 경우 @ResponseBody를 추가로 사용해야 하며 HTML로 이루어진 화면이 아닌 JSON이나 XML 형식으로 이루어진 데이터가 반환됩니다.
@ResponseBody는 클래스 또는 메소드에 적용할 수 있습니다. 클래스 레벨에 적용한 경우 해당 클래스에 사용자의 요청을 처리하는 메소드에 @ResponseBody가 적용됩니다.
@Controller
@ResponseBody
public class HelloController {
@GetMapping("/hello")
public String hello() {
...
}
@GetMapping("/info")
public User getUser() {
...
}
}
만약 메소드 별로 화면을 반환하는 역할과 데이터를 반환하는 역할을 분리하고 싶다면 메소드 레벨에 적용하는 것이 좋습니다.
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello() {
...
}
@GetMapping("/info")
@ResponseBody
public User getUser() {
...
}
}
물론 한 컨트롤러 클래스에 화면을 반환하는 역할과 데이터를 반환하는 역할이 같이 있어도 크게 문제는 없지만 역할을 분리해 작성하는 것이 좋다고 생각합니다.
@ResponseBody가 사용된 경우 데이터를 반환하기 때문에 ViewResolver가 동작하지 않고 HttpMessageConverter가 동작하게 됩니다. 스프링은 다양한 Converter를 구현해두고 있습니다. 데이터의 종류에 따라 서로 다른 HttpMessageConverter가 동작하며 Json 형식의 데이터를 반환하는 경우 MappingJackson2HttpMessageConverter가 동작합니다.
| @RestController
많은 웹 서비스가 RESTFul 형식으로 이루어져 있으며 RESTFul 웹 서비스에서는 클라이언트와 서버가 JSON이나 XML 형태로 이루어진 데이터를 주고받으며 작업을 수행합니다.
@RestController가 등장하기 전에 RESTFul한 웹 서비스를 개발하기 위해서는 @Controller와 @ResponseBody를 함께 사용해야 했습니다. 스프링은 매번 @Controller와 @ResponseBody가 같이 사용된다는 문제를 찾아냈고 스프링 4.0부터는 @Controller와 @ResponseBody가 조합된 @RestController를 만들었습니다.
@Controller
@ReponseBody
public class HelloController {
@GetMapping("/hello")
public String hello() {
...
}
}
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
...
}
}
@RestController를 확인하면 @Controller와 @ResponseBody가 포함되어 있는 것을 확인할 수 있습니다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
...
}
@RestController가 등장하면서 더 이상 @Controller와 @ResponseBody를 조합하지 않아도 되고 @RestController 하나 만으로도 동일한 기능을 사용할 수 있어 편리하게 RESTFul 웹 서비스를 개발할 수 있습니다.
| 정리
- @Controller는 주로 JSP, Thymleaf 등을 사용해 HTML로 이루어진 화면을 반환하는 역할을 수행하는 반면 @RestController는 응답 본문에 데이터가 반환되므로 RESTFul 웹 서비스에서 사용됩니다.
- @Controller와 @ResponseBody를 조합해 데이터를 반환할 수 있습니다.
- @RestController는 @Controller와 @ResponseBody의 조합입니다.
- @RestController를 사용하면 모든 메서드의 처리 결과가 HTTP 응답 본문에 반환됩니다.
댓글남기기