Message Converter(메시지 컨버터)
뷰 템플릿이나 정적 컨텐츠를 응답하는 것이 아니라, JSON, XML 또는 사용자 지정 형식과 같은 다양한 형식의 데이터를 교환하는 작업이 필요할 때 메시지 컨버터를 사용할 수 있다.
HTTP 요청:
@RequestBody
,HttpEntity
,RequestEntity
HTTP 응답:
@ResponseBody
,HttpEntity
,ResponseEntity
Spring MVC에선 위의 경우 메시지 컨버터를 사용하여 HTTP 요청 본문을 자바 객체로 변환하거나, 자바 객체를 HTTP 응답 본문으로 직렬화한다.
ViewResolver와 MessageConverter 비교
목적
논리적 뷰 이름을 실제 뷰로 해석
HTTP 본문을 객체로 변환하거나 객체를 본문으로 직렬화
동작 시점
컨트롤러 반환값이 뷰 이름일 때
@RequestBody, @ResponseBody, HttpEntity, ResponseEntity 사용 시
입력/출력 대상
JSP, Thymeleaf, FreeMarker 등 템플릿 뷰
JSON, XML, 문자열, 바이트 등 데이터 형식
주된 사용 예시
HTML 페이지 렌더링
REST API 요청/응답 처리
HTTP 메시지 컨버터 인터페이스
메시지 컨버터는 다음 인터페이스를 기반으로 동작하며, 읽기와 쓰기 기능을 정의한다.
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;
}
canRead()
/canWrite()
: 메시지 컨버터가 해당 클래스, 미디어 타입을 지원하는지 확인read()
/write()
: 메시지 컨버터를 통해서 메시지를 읽고 쓰는 기능
주요 구현체
인터페이스를 구현한 다양한 메시지 컨버터가 존재하며, 대표적인 구현체는 다음과 같다.
ByteArrayHttpMessageConverter
바이트 배열 지원, 파일 다운로드나 이미지 응답에 활용
StringHttpMessageConverter
문자열 데이터 지원
MappingJackson2HttpMessageConverter
JSON 직렬화와 역직렬화
MappingJackson2XmlHttpMessageConverter
XML 처리 지원
FormHttpMessageConverter
application/x-www-form-urlencoded 요청 및 응답 처리
스프링 부트 기본 메시지 컨버터
스프링 부트에서는 다양한 메시지 컨버터를 제공하는데, 클래스 타입과 미디어 타입을 체크하여 사용여부를 체크하게 되며, 우선 순위는 다음과 같다.
ByteArrayHttpMessageConverter
:byte[]
데이터 처리StringHttpMessageConverter
:String
문자로 데이터 처리MappingJackson2HttpMessageConverter
:application/json
처리
HTTP 요청 데이터 읽기 및 응답 데이터 생성 과정
메시지 컨버터가 메시지를 읽을 수 있는지 확인하기 위해
canRead()
호출대상 클래스 타입을 지원하는지, HTTP 요청의 Content-Type 미디어 타입을 지원하는지 확인
canRead()
조건을 만족하는 경우read()
호출하여 객체를 생성하고 반환컨트롤러 로직 실행
메시지 컨버터가 메시지를 쓸 수 있는지 확인하기 위해
canWrite()
호출대상 클래스 타입을 지원하는지, HTTP 응답의 Content-Type 미디어 타입을 지원하는지 확인
canWrite()
조건을 만족하는 경우write()
호출하여 HTTP 응답 메시지 바디에 데이터 생성
참고자료
Last updated
Was this helpful?