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) |
'Dev Framework > Spring' 카테고리의 다른 글
[Spring] @Configuration과 CGLIB 프록시 마법 (0) | 2025.04.01 |
---|---|
[Spring] HttpServlet 완벽 정리 (0) | 2025.03.31 |
[Spring] 스프링 AOP - 1 (0) | 2025.03.28 |
[JPA] JPA 영속성 컨텍스트 with 프록시 - 2 (0) | 2025.03.23 |
[JPA] JPA 영속성 컨텍스트 완전 정복 - 1 (0) | 2025.03.23 |
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) |
'Dev Framework > Spring' 카테고리의 다른 글
[Spring] @Configuration과 CGLIB 프록시 마법 (0) | 2025.04.01 |
---|---|
[Spring] HttpServlet 완벽 정리 (0) | 2025.03.31 |
[Spring] 스프링 AOP - 1 (0) | 2025.03.28 |
[JPA] JPA 영속성 컨텍스트 with 프록시 - 2 (0) | 2025.03.23 |
[JPA] JPA 영속성 컨텍스트 완전 정복 - 1 (0) | 2025.03.23 |