
@RestController와 @Controller의 주요한 차이점은 @RestController에는 HTTP Response Body가 생성되는 방식입니다.
@RestController와 @Controller의 차이를 비교해보면서 정리하였습니다.
@Controller는 주로 View를 반환하기 위하여 사용 합니다.
![]()
컨트롤러에서도 Data를 반환해야 하는 경우도 있습니다. 컨트롤러에서 데이터를 반환하기 위하여 @ResponseBody 어노테이션을 사용해야합니다.
![]()
@Controller
@RequestMapping("/book")
@RequiredArgsConstructor
public class UserController {
private final BookService bookService;
@PostMapping(value = "/info")
public @ResponseBody Book info(@RequestBody Book book){
return bookService.retrieveBookInfo(book);
}
@GetMapping(value = "/infoView")
public String infoView(Model model, @RequestParam(value = "bookName", required = true) String bookName){
Book book = bookService.retrieveBookInfo(bookName);
model.addAttribute("book", book);
return "/user/userInfoView";
}
}
Spring MVC Controller에 @ResponseBody가 추가된 것입니다. @RestController의 주 용도는 JSON 형태로 객체 데이터를 반환하는 것입니다.
![]()
@RestController가 Data를 반환하기 위해서는 viewResolver 대신에 HttpMessageConverter가 동작합니다.
HttpMessageConverter에는 여러 Converter가 등록되어 있고, 반환해야 하는 데이터에 따라 사용되는 Converter가 달라집니다.
단순 문자열인 경우에는 StringHttpMessageConverter가 사용되고, 객체인 경우에는 MappingJackson2HttpMessageConverter가 사용되며, 데이터 종류에 따라 서로 다른 MessageConverter가 작동하게 됩니다.
Spring은 클라이언트의 HTTP 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해 적합한 HttpMessageConverter 를 선택하여 이를 처리합니다.