

@ResponseBody가 HTTP의 Body에 있는 문자 내용을 그대로 반환한다.viewResolver 대신 StringHttpMessageConverter가 동작한다.StringHttpMessageConverter, 객체는 MappingJackson2HttpMessageConverter가 동작한다.Content-Type Header와는 다르다!public interface HttpMessageConverter<T> {
boolean canRead(Class<?> clazz, @Nullable MediaType mediaType);
boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);
List<MediaType> getSupportedMediaTypes();
default List<MediaType> getSupportedMediaTypes(Class<?> clazz) {
return !this.canRead(clazz, (MediaType)null) && !this.canWrite(clazz, (MediaType)null) ? Collections.emptyList() : this.getSupportedMediaTypes();
}
T read(Class<? extends T> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException;
void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException;
}
0 = ByteArrayHttpMessageConverter
1 = StringHttpMessageConverter
2 = MappingJackson2HttpMessageConverter
...
@RequestBody, HttpEntity 파라미터를 호출하고 canRead()로 검사한다. 클래스 타입 지원 여부, Content-Type 지원 여부canRead()의 조건을 만족하면 read()를 호출해 객체를 생성하고 반환한다.@RequestBody, HttpEntity로 값을 반환하고 canWrite()로 조건을 검사한다. 클래스 타입 지원 여부, Accept 미디어 타입 지원여부 write()를 호출하고, HTTP 응답 메세지 바디에 데이터를 생성한다.content-type: application/json
@RequestMapping
void hello(@RequetsBody String data){}
canRead()로 0번 기준으로 검사 => Byte 형식이 아님 => 다음 컨버터로 넘어감canRead()로 1번 기준으로 검사 => String 형식이 맞음 => Content-Type 맞음 이것이 어디에 쓰이는지를 알기 위해서는 핸들러 어댑터 구조에 대해 자세히 알아야 한다.