HTTP 메세지 바디에서 데이터를 직접 읽어와야 하거나, 전달해야 할 때 사용되는 HTTP 메세지컨버터의 동작 원리를 나타낸다.
HTTP 메세지 컨버터
는 HTTP API처럼 HTTP 메세지 바디에서 데이터를 직접 읽어와야 하거나, 전달해야 할 때 동작한다. 뷰 템플릿으로 HTML을 생성해서 응답하는 경우는 동작하지 않는다.
@ResponseBody가 동작하는 과정
- HTTP의 BODY에 문자 내용을 직접 반환
- viewResolver 대신에 HttpMessageConverter가 동작
- 기본 문자처리: StringHttpMessageConverter
- 기본 객체처리: MappingJackson2HttpMessageConverter
- byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음
응답의 경우 클라이언트의 HTTP Accept
헤더와 서버의 컨트롤러 반환 타입
정보를 조합해서 HttpMessageConverter
가 선택된다.
package org.springframework.http.converter;
public interface HttpMessageConverter<T> {
boolean canRead(Class<?> clazz, @Nullable MediaType mediaType);
boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);
List<MediaType> getSupportedMediaTypes();
T read(Class<? extends T> clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException;
void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException;
}
Spring은 다양한 HttpMessageConverter를 제공하고 있고 우선순위가 있다. 대상 Class와 MediaType을 체크해서 어떤 Converter를 사용할지 결정한다.
ByteArrayHttpMessageConverter
byte[]
Data를 처리한다.byte[]
*/*
application/octet-stream
StringHttpMessageConverter
String
Data를 처리한다.String
*/*
text/plain
MappingJackson2HttpMessageConverter
JSON
Data를 처리한다.Object
, HashMap
application/json
application/json
@ResponseBody
, HttpEntity
로 값이 반환된다.Controller에 produces 속성을 따로 설정하지 않으면 요청 헤더의 Accept가 Default 이다.