Skip to content

Message Converter

뷰 템플릿이나 정적 컨텐츠를 응답하는 것이 아니라, JSON, XML 또는 사용자 지정 형식과 같은 다양한 형식의 데이터를 교환하는 작업이 필요할 때 메시지 컨버터를 사용할 수 있다.

  • HTTP 요청: @RequestBody, HttpEntity, RequestEntity
  • HTTP 응답: @ResponseBody, HttpEntity, ResponseEntity

Spring MVC에선 위의 경우 메시지 컨버터를 사용하여 HTTP 요청 본문을 자바 객체로 변환하거나, 자바 객체를 HTTP 응답 본문으로 직렬화한다.

구분ViewResolverMessageConverter
목적논리적 뷰 이름을 실제 뷰로 해석HTTP 본문을 객체로 변환하거나 객체를 본문으로 직렬화
동작 시점컨트롤러 반환값이 뷰 이름일 때@RequestBody, @ResponseBody, HttpEntity, ResponseEntity 사용 시
입력/출력 대상JSP, Thymeleaf, FreeMarker 등 템플릿 뷰JSON, XML, 문자열, 바이트 등 데이터 형식
주된 사용 예시HTML 페이지 렌더링REST API 요청/응답 처리

메시지 컨버터는 다음 인터페이스를 기반으로 동작하며, 읽기와 쓰기 기능을 정의한다.

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문자열 데이터 지원
MappingJackson2HttpMessageConverterJSON 직렬화와 역직렬화
MappingJackson2XmlHttpMessageConverterXML 처리 지원
FormHttpMessageConverterapplication/x-www-form-urlencoded 요청 및 응답 처리

스프링 부트 기본 메시지 컨버터

Section titled “스프링 부트 기본 메시지 컨버터”

스프링 부트에서는 다양한 메시지 컨버터를 제공하는데, 클래스 타입과 미디어 타입을 체크하여 사용여부를 체크하게 되며, 우선 순위는 다음과 같다.

  1. ByteArrayHttpMessageConverter: byte[] 데이터 처리
  2. StringHttpMessageConverter: String 문자로 데이터 처리
  3. MappingJackson2HttpMessageConverter: application/json 처리

HTTP 요청 데이터 읽기 및 응답 데이터 생성 과정

Section titled “HTTP 요청 데이터 읽기 및 응답 데이터 생성 과정”
  1. 메시지 컨버터가 메시지를 읽을 수 있는지 확인하기 위해 canRead() 호출
    • 대상 클래스 타입을 지원하는지, HTTP 요청의 Content-Type 미디어 타입을 지원하는지 확인
  2. canRead() 조건을 만족하는 경우 read() 호출하여 객체를 생성하고 반환
  3. 컨트롤러 로직 실행
  4. 메시지 컨버터가 메시지를 쓸 수 있는지 확인하기 위해 canWrite() 호출
    • 대상 클래스 타입을 지원하는지, HTTP 응답의 Content-Type 미디어 타입을 지원하는지 확인
  5. canWrite() 조건을 만족하는 경우 write() 호출하여 HTTP 응답 메시지 바디에 데이터 생성

Last updated:

Spring