HTTP 메시지 컨버터란?

HTTP 메시지 컨버터는 뷰 템플릿 없이, JSON 같은 데이터를 HTTP 바디에 직접 읽고 쓰고자 할 때 사용하는 도구입니다.

 

언제 사용되나요?

  • @RequestBody, @ResponseBody
  • HttpEntity, RequestEntity, ResponseEntity

등을 사용할 때 스프링 MVC가 자동으로 메시지 컨버터를 적용합니다.

 

@ResponseBody 사용 원리

 

  • @ResponseBody 를 사용할 경우
    • HTTP의 BODY에 문자 내용을 직접 반환
    • viewResolver 대신에 HttpMessageConverter가 동작
    • 기본 문자처리: StringHttpMessageConverter
    • 기본 객체처리: MappingJackson2HttpMessageConverter
    • byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음
  • 스프링 MVC는 다음의 경우에 HTTP 메시지 컨버터를 적용한다.
    • HTTP 요청: @RequestBody, HttpEntity(RequestEntity)
    • HTTP 응답: @ResponseBody, HttpEntity(ResponseEntity)

 

핸들러 어댑터에서 작동하는 HTTP 메세지 컨버터

 

인터페이스 구조

public interface HttpMessageConverter<T> {
    boolean canRead(Class<?> clazz, @Nullable MediaType mediaType);
    boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);
    T read(Class<? extends T> clazz, HttpInputMessage inputMessage);
    void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage);
}
  • canRead() : 읽을 수 있는 타입인지 판단합니다
  • read() : 요청 바디에서 데이터를 읽어 객체로 변환합니다
  • canWrite() : 쓸 수 있는 타입인지 판단합니다
  • write() : 객체를 HTTP 응답 바디에 씁니다

 

주요 컨버터 예시

1. ByteArrayHttpMessageConverter

  • 요청: @RequestBody byte[] data
  • 응답: @ResponseBody return byte[]
  • 미디어 타입: application/octet-stream

 

2. StringHttpMessageConverter

  • 요청: @RequestBody String data
  • 응답: @ResponseBody return "ok"
  • 미디어 타입: text/plain

 

3. MappingJackson2HttpMessageConverter

  • 요청: @RequestBody HelloData data
  • 응답: @ResponseBody return HelloData
  • 미디어 타입: application/json
  • 내부적으로 Jackson 라이브러리를 사용하여 JSON ↔ 객체 변환을 수행합니다

 

스프링 부트의 기본 메시지 컨버터 우선 순위

순번 클래스 이름 설명
0 ByteArrayHttpMessageConverter byte[] 처리
1 StringHttpMessageConverter 문자열 처리
2 MappingJackson2HttpMessageConverter JSON 처리 (객체 <-> JSON)

 

 

MappingJackson2HttpMessageConverter 사용 예시

요청 처리 과정 (읽기)

@PostMapping("/hello")
public void hello(@RequestBody HelloData data) { ... }
  • ① canRead() → 이 클래스(HelloData)와 Content-Type이 지원되는지 확인
  • ② read() → HTTP 바디를 객체로 변환

 

응답 처리 과정 (쓰기)

@GetMapping("/hello")
public @ResponseBody HelloData hello() {
    return new HelloData("hello", 123);
}
  • ① canWrite() → 반환 클래스와 Accept 헤더를 기반으로 지원되는지 확인
  • ② write() → 객체를 JSON 문자열 등으로 변환해 HTTP 바디에 씀

 

Accept Header란?

정의

클라이언트가 수신 가능한 콘텐츠 타입(Content-Type)을 서버에게 알려주는 HTTP 요청 헤더

서버는 이 값을 참고해서 **그에 맞는 형식(ex. JSON, XML, HTML 등)**으로 응답합니다.

쉽게 말해서..

Accept 헤더는 클라이언트(브라우저나 앱)가 "나는 이런 종류의 데이터를 받고 싶어요" 라고 서버에 요청할 때 사용하는 HTTP 요청 헤더입니다.

 

HTTP 메세지로 직접 보는 예시

GET /hello HTTP/1.1
Host: example.com
Accept: application/json
  • 위 요청은 “나 JSON 받고 싶어” 라고 말하는 것과 같습니다.
  • 서버는 application/json으로 응답할 확률이 높습니다.

 

실제 상황 예시

클라이언트가 HTML을 원할 때

Accept: text/html
  • 브라우저에서 페이지 요청 시 기본적으로 포함되는 값입니다.
  • 서버는 HTML 페이지(SSR)를 만들어 응답합니다.

클라이언트가 JSON을 원할 때

Accept: application/json
  • 자바스크립트 기반 프론트엔드(Vue, React 등)나 모바일 앱이 API 호출 시 자주 사용됩니다.
  • 서버는 JSON 형식으로 응답합니다.

 

스프링과의 연관

스프링 MVC에서는 @ResponseBody 또는 ResponseEntity를 사용할 때,

클라이언트의 Accept 헤더를 기반으로 어떤 HttpMessageConverter를 사용할지 결정합니다.

@GetMapping("/data", produces = "application/json")
public @ResponseBody HelloData data() {
    return new HelloData("kim", 20);
}
  • produces 속성은 Accept 헤더와 비교됩니다
  • 일치하는 메시지 컨버터가 있으면 사용됩니다

 

사용 예시 정리

항목 내용
View 기반 처리 ViewResolver가 템플릿 찾아서 HTML 응답
JSON 등 데이터 응답 HttpMessageConverter가 HTTP 바디에 직접 데이터 출력
주요 어노테이션 @RequestBody, @ResponseBody, HttpEntity
자동 선택 기준 클래스 타입 + 미디어 타입(Content-Type / Accept)
개발자 성현