Rootable의 개발일기
HTTP 메시지 컨버터(HTTP Message Converter) 본문
📌 역할
1. HTTP 메시지 바디의 내용을 우리가 읽을 수 있도록 객체 또는 문자로 변환해 준다.
2. HTTP 메시지 바디에 우리가 생성한 데이터를 적을 수 있도록 한다.
3. HTTP 메시지 컨버터는 지원하는 클래스 타입, 미디어 타입에 따라 메시지 컨버터가 선택된다.
HTTP Body의 데이터를 직접 읽거나 생성할 때 사용
📌 사용 원리
@ResponseBody를 사용하면 HttpMessageConverter가 동작한다. 이 경우, 뷰 리졸버가 동작하지 않는다. 따라서, 화면을 렌더링 하지 않고 HTTP 바디의 데이터를 읽거나 쓸 수 있도록 변환하는 작업을 한다.
예를 들어 아래 그림처럼 String 타입 데이터를 받은 후 String 타입 데이터를 내려주는 경우, HttpMessageConverter 중 StringHttpMessageConverter가 동작하여 HTTP 바디를 읽을 수 있도록 변환하거나 HTTP 바디에 문자 데이터를 적을 수 있도록 한다.
🔎 적용 범위
스프링 MVC는 다음의 경우에 HTTP 메시지 컨버터를 적용한다.
- HTTP 요청: @RequestBody, HttpEntity(RequestEntity)
- HTTP 응답: @ResponseBody, HttpEntity(ResponseEntity)
🔎 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, HttpOutputMessageoutputMessage) throws IOException, HttpMessageNotWritableException;
}
- canRead(), canWrite() : 메시지 컨버터가 해당 클래스, 미디어 타입을 지원하는지 체크
- read(), write() : 메시지 컨버터를 통해 메시지를 읽고 쓰는 기능
🔎 스프링 부트 기본 메시지 컨버터
스프링 부트는 다양한 메시지 컨버터를 제공하는데, 대상 클래스 타입과 미디어 타입 둘을 체크해서 사용여부를 결정한다. 만약 만족하지 않으면 다음 메시지 컨버터로 우선순위가 넘어간다.
✔ (0순위) ByteArrayHttpMessageConverter
byte[] 데이터로 처리
클래스 타입 : byte[]
미디어 타입 : */*
✔ (1순위) StringHttpMessageConverter
String 문자로 데이터를 처리
클래스 타입 : String
미디어 타입 : */*
✔ (2순위) MappingJackson2HttpMessageConverter
JSON 데이터로 처리, 객체를 전달하는 경우
클래스 타입 : 객체 또는 HashMap
미디어 타입 : application/json
📌 HTTP 요청 데이터 읽기
- HTTP 요청이 오고, 컨트롤러에서 HttpEntity 또는 @RequestBody 사용
- 메시지 컨버터가 메시지를 읽을 수 있는지 확인하기 위해 canRead() 호출
- 대상 클래스 지원여부
- HTTP 요청의 Content-Type 미디어 타입 지원여부
- canRead() 조건을 만족하면 read()를 호출해서 객체 생성하고 반환
- HttpEntity 또는 @RequestBody가 적용된 파라미터에서 반환된 객체를 받아서 사용
📌 HTTP 응답 데이터 생성
- 컨트롤러에서 @ResponseBody 또는 HttpEntity 사용
- 메시지 컨버터가 메시지를 쓸 수 있는지 확인하기 위해 canWrite() 호출
- 대상 클래스 지원여부
- HTTP 요청의 Accept 미디어 타입 지원여부(@RequestMapping의 produces 옵션을 보고 Accept 확인)
- canWrite() 조건을 만족하면 write()를 호출해서 객체 생성하고 반환
- 컨트롤러에서 반환된 객체를 받아서 사용
Reference:
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
'Spring' 카테고리의 다른 글
스프링 MVC 검증 - Validation (0) | 2023.07.22 |
---|---|
요청 매핑 핸들러 어뎁터 구조 (0) | 2023.07.18 |
HTTP 요청 파라미터 (0) | 2023.07.15 |
HTTP 요청 매핑 (0) | 2023.07.15 |
@RequestParam vs @ModelAttribute vs @RequestBody (0) | 2023.07.14 |