HTTP 메시지 컨버터란, 요청 본문에서 메시지를 읽어들이거나(@RequestBody), 응답 본문에 메시지를 작성할 때(@ResponseBody) 사용하는 컨버터다.
ByteArrayHttpMessageConverter
StringHttpMessageConverter
MappingJacksonHttpMessageConverter
...
기본적으로 위의 컨버터들을 지원함
- 대상 클래스 타입과 미디어 타입을 체크해 사용여부 결정
(만족하지 않는 경우 다음 메시지 컨버터로 우선순위 넘어감)
ex1: @RequestBody String data 형식으로 요청이 오면 StringHttpMessageConverter 사용
ex2: @ResponseBody return helloData로 쓰고 미디어 타입 application/json인 경우 MappingJacksonHttpMessageConverter 사용
HTTP 요청이 들어오고, 컨트롤러에서 @RequestBody나 HttpEntity 파라미터 사용
메시지 컨버터가 canRead() 호출 // 읽을 수 있는 메시지인지 확인
컨트롤러에서 @ResponseBody나 HttpEntity로 값 반환
메시지 컨버터가 canWrite() 호출 // 메시지를 쓸 수 있는지 확인
SpringMVC 구조

위 과정에서 5번 과정을 주목해보자.
어노테이션 기반의 핸들러(컨트롤러)의 여러 파라미터를 생성해서 호출할 수 있는 '핸들러 어댑터'
이 어댑터가 HTTP 메시지 컨버터와 관련이 있다.
먼저, @RequestMapping을 처리하는 핸들러 어댑터인 RequestMappingHandlerAdapter를 자세히 살펴보자
1. ArgumentResolver 호출
ArgumentResolver: 매우 다양한 종류의 파라미터를 유연하게 처리해 파라미터 값(객체) 생성
2. 파라미터 값이 준비되면 컨트롤러를 호출하며 값을 넘겨줌

만약 ArgumentResolver에 요청하는 파라미터가 @RequestBody 또는 HttpEntity인 경우 HTTP 메시지 컨버터를 사용해 'read' 한다. 응답의 경우에도 @ResponseBody 또는 HttpEntity를 처리하는 ReturnValueHandler에서 HTTP 메시지 컨버터를 호출해 응답 결과를 'write' 한다.