@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 를 선택하여 이를 처리합니다.