Post

[Spring] 메시지 컨버터(Message Converter)

📌 들어가며

이번 글에서는 스프링의 MessageConverter를 정리한다.

MessageConverter란? Spring MVC에서 요청·응답 메시지를 변환하는 인터페이스. HTTP 본문 ↔ 자바 객체 변환을 담당한다. 스프링이 자동 처리하므로 개발자가 변환 코드를 따로 안 써도 된다.

1
2
HTTP 요청 본문 ──read──►  자바 객체
자바 객체     ──write──►  HTTP 응답 본문 (JSON/XML/...)

1. 주요 구현체

구현체변환 형식
ByteArrayHttpMessageConverter바이트 배열
StringHttpMessageConverter문자열
FormHttpMessageConverterHTML 폼 데이터
MappingJackson2HttpMessageConverterJSON
MarshallingHttpMessageConverterXML

2. JSON 변환

@RestController에서 객체를 반환하면 자동으로 JSON으로 변환된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@RestController
public class MyController {
    @GetMapping("/json")
    public MyObject getJson() {
        MyObject obj = new MyObject();
        obj.setId(1);
        obj.setName("John");
        return obj;   // → {"id":1,"name":"John"} 자동 변환
    }

    @Bean
    public MappingJackson2HttpMessageConverter jsonConverter() {
        return new MappingJackson2HttpMessageConverter();
    }
}

3. 사용자 정의 컨버터

필요하면 HttpMessageConverter를 직접 구현한다.

1
2
3
4
5
6
7
8
9
public class MyCustomMessageConverter implements HttpMessageConverter<MyObject> {
    @Override public boolean canRead(Class<?> c, MediaType m)  { return false; }
    @Override public boolean canWrite(Class<?> c, MediaType m) { return true; }
    @Override public List<MediaType> getSupportedMediaTypes() {
        return Collections.singletonList(MediaType.APPLICATION_JSON);
    }
    @Override public MyObject read(...) { ... }
    @Override public void write(...) { ... }
}
메소드역할
canRead / canWrite이 타입을 변환할 수 있는가
read / write실제 변환

📌 주의사항과 팁

항목내용
우선순위여러 컨버터 등록 시 우선순위로 선택
충돌 방지같은 형식 처리 컨버터끼리 충돌 주의
자동 등록기본 컨버터는 스프링이 자동 등록

📝 정리

1
2
3
4
5
MessageConverter
├─ 역할   HTTP 본문 ↔ 자바 객체 변환
├─ 구현체  Jackson(JSON) / String / Form / XML
├─ 커스텀  HttpMessageConverter 직접 구현
└─ 주의   우선순위 · 충돌 · 자동 등록
개념한 줄 정의
MessageConverter요청/응답 본문 변환기
MappingJackson2JSON 변환 (기본)
커스텀 컨버터특수 형식 직접 처리

MessageConverter는 “본문과 객체 사이의 번역기”다. @RestController가 객체를 JSON으로 자동 변환하는 것도 이 컨버터 덕분이다. 특수한 변환이 필요하면 직접 구현해 등록할 수 있다.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.