[Spring] HttpMessageConverter
1. HttpMessageConverter란?
- 스프링 프레임워크에서 제공하는 인터페이스
package org.springframework.http.converter;
public interface HttpMessageConverter<T> {
//canXXX는 해당 class 타입과, 미디어타입을 체크한다.
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;
}
- HTTP 요청 → 객체 or 객체 → HTTP 응답으로 바꾸는데 사용
- 각각 아래와 같은 경우에 사용
- HTTP 요청 :
@ReqeustBody
,HttpEntity(ReqeustEntity)
canRead()
를 사용해 메시지 컨버터가 읽을 수 있는지 확인ⅱ. HTTP 요청의 Content-Type의 미디어 타입을 지원하는지 확인- ⅰ. 대상 클래스 타입을 지원하는지 확인
canRead()
조건에 만족하면read()
를 호출해서 객체를 생성하고 반환
- HTTP 응답 :
@ResponseBody
,HttpEntity(ResponseEntity)
canWrite()
를 사용해 메시지 컨버터가 읽을 수 있는지 확인ⅱ. HTTP 요청의 Accept의 미디어 타입을 지원하는지 확인- ⅰ. 대상 클래스 타입을 지원하는지 확인
canWrite()
조건에 만족하면write()
를 호출해서 HTTP 응답 메시지 바디에 데이터를 생성
2. 스프링 부트 기본 메시지 컨버터
- 자주 사용하는 3가지
- ByteArrayHttpMessageConverter
- StringHttpMessageConverter
- MappingJackson2HttpMessageConverter
2.1 ByteArrayHttpMessageConverter
byte[]
데이터를 처리- 지원하는 클래스 타입 :
byte[]
- 지원하는 미디어 타입 :
*/*
- 지원하는 클래스 타입 :
2.2 StringHttpMessageConverter
String
데이터를 처리- 지원하는 클래스 타입 :
String
- 지원하는 미디어 타입 :
*/*
- 지원하는 클래스 타입 :
2.3 MappingJackson2HttpMessageConverter
- 객체 또는
HashMap
데이터를 처리- 지원하는 클래스 타입 : 객체 or
HashMap
- 지원하는 미디어 타입 :
application/json
- 지원하는 클래스 타입 : 객체 or
3. 동작 시점
- HTTP 메시지 컨버터의 동작 시점을 알려면 ArgumentResolver와 ReturnValueHandler를 먼저 이해해야 한다.
- 아래와 같은 생각을 해보자.
@RequestParm
이나@ModelAttribute
를 사용할 때, 스프링은 컨트롤러의 다양한 매개변수들을 찾아서 대입을 해준다.@RequestBody
나HttpEntity
를 사용할 때, HTTP 메시지를 처리 해준다.- 또한 컨트롤러는 뷰 이름을 반환할 수도 있고,
HttpEntity
같은 객체를 반환할 수 있다. - 어떻게 이게 가능할까?
- ArgumentResolver
- ArgumentResolver는 핸들러 어댑터의 요청으로 컨트롤러의 매개변수를 확인하여 알맞은 매개변수를 찾아준다.
- ArgumentResolver 내부의
supportParmeter()
를 실행하여 해당 매개변수의 지원 여부를 확인하고, 지원이 되면resolveArgument()
를 사용하여 실제 객체를 생성한다. - 생성된 객체는 컨트롤러 호출시 전달해 준다.
- ArgumentResolver 내부의
- ArgumentResolver는 핸들러 어댑터의 요청으로 컨트롤러의 매개변수를 확인하여 알맞은 매개변수를 찾아준다.
- ReturnValueHandler
- ArgumentResolver와 비슷
- 응답 값을 변환하고 처리하는 역할을 수행
HttpMessageConverter 동작시점
- ArgumentResolver와 ReturnValueHandler가 HttpMessageConverter를 사용한다.
- HttpMessageConverter를 사용하는 기능(
@ResponseBody
,@RequestBody
,HttpEntity
)이 있으면 사용하여 객체를 생성하거나, 응답 결과를 만든다.
- HttpMessageConverter를 사용하는 기능(
※ 참조
'FRAMEWORK > [SPRING]' 카테고리의 다른 글
[Spring] Spring 검증 기능2 (Bean Validation) (0) | 2022.06.09 |
---|---|
[Spring] Spring 검증 기능1 (BindingResult, Validator) (0) | 2022.06.07 |
[Spring] Spring MVC 구조 (0) | 2022.06.05 |
[Spring] CGI vs Servlet (0) | 2022.06.03 |
[Spring] Web Server vs WAS (0) | 2022.06.02 |