위에서 설명한 Dispatcher Servlet에서 요청을 처리하는 과정을 알아보았다. 근데 결론은 HTML을 랜더링 해서 보여주는 것이었는데, HTTP API처럼 JSON 데이터를 HTTP 메시지 body에서 직접 읽고 처리하려면 어떻게 해야 할까?
결론은 HTTP 메시지 컨버터를 사용하면 편리하게 데이터를 처리할 수 있다.
인프런 김영한 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
위 그림에서 볼 수 있듯이 @ResponseBody 사용 시 문자는 StringConverter로 객체는 JsonConverter로 처리되고 이러한 Converter들을 HTTP 메시지 컨버터라 부른다. 이 외에도 여러 컨버터들이 기본적으로 등록되어 있다고 한다. 이러한 컨버터들은인터페이스인 HttpMessageConverter를 구현하여 만들어진다.
HTTP 메시지 컨버터는 요청과 응답에 모두 사용된다. HTTP 요청 시 @RequestBody, HttpEntity(RequestEntity)가 사용되고, 응답에는 @ResponseBody, HttpEntity(ResponseEntity)가 사용된다.
그럼 이제 HTTP 메시지 컨버터 인터페이스를 살펴보자.
HttpMessageConverter.class
여기에서 중요한 건 canRead, canWrite (메시지 컨버터가 해당 클래스, 미디어 타입을 지원하는지) 그리고 read, write (실제로 메시지 컨버터를 통해 메시지를 읽고 쓰는 기능)이다.
스프링 부트는 대상 클래스 타입과 미디어 타입을 체크해서 어떤 메시지 컨버터를 사용할지 결정한다.
위에서 언급한 StringHttpMessageConverter는 String으로 데이터를 처리하고 모든 미디어 타입(*/*)을 지원한다. 객체를 처리하는 MappingJackson2HttpMessageConverter는 객체 혹은 HashMap으로 처리하며 application/json을 지원한다.
그럼 저번 Dispatcher Servlet 그림에서 어디쯤에서 사용되는 것일까?
인프런 김영한 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
바로 핸들러 어댑터에 의해 핸들러가 처리될 때 사용된다.
인프런 김영한 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
핸들러 어댑터가 실행되면 Argument Resolver에 의해 어떻게 값을 처리할지(HttpServletRequest, @RequestBody, ... 중 어떤 방식인지) 파라미터가 추출되면 이제 해당 파라미터와 함께 핸들러가 호출된다. 그리고 ReturnValue Handler에 의해 어떻게 값을 반환할지(HttpServletRequest, @RequestBody, ... 중 어떤 방식인지) 결정해서 핸들러 어댑터로 반환한다. 그런데 여기에서도 HTTP 메시지 컨버터는 보이지 않는다. 진짜 어디 있는 걸까?
인프런 김영한 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
예상했다시피Argument Resolver와ReturnValue Handler에서 사용된다.