관리 메뉴

Rootable의 개발일기

HTTP 메시지 컨버터(HTTP Message Converter) 본문

Spring

HTTP 메시지 컨버터(HTTP Message Converter)

dev-rootable 2023. 7. 17. 20:53

📌 역할

 

1. HTTP 메시지 바디의 내용을 우리가 읽을 수 있도록 객체 또는 문자로 변환해 준다.

2. HTTP 메시지 바디에 우리가 생성한 데이터를 적을 수 있도록 한다.

3. HTTP 메시지 컨버터는 지원하는 클래스 타입, 미디어 타입에 따라 메시지 컨버터가 선택된다.

 

HTTP Body의 데이터를 직접 읽거나 생성할 때 사용

 

📌 사용 원리

 

@ResponseBody를 사용하면 HttpMessageConverter가 동작한다. 이 경우, 뷰 리졸버가 동작하지 않는다. 따라서, 화면을 렌더링 하지 않고 HTTP 바디의 데이터를 읽거나 쓸 수 있도록 변환하는 작업을 한다.

 

예를 들어 아래 그림처럼 String 타입 데이터를 받은 후 String 타입 데이터를 내려주는 경우, HttpMessageConverter 중 StringHttpMessageConverter가 동작하여 HTTP 바디를 읽을 수 있도록 변환하거나 HTTP 바디에 문자 데이터를 적을 수 있도록 한다.

 

출처 : 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 by 김영한

 

🔎 적용 범위

 

스프링 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 요청 데이터 읽기

 

  1. HTTP 요청이 오고, 컨트롤러에서 HttpEntity 또는 @RequestBody 사용
  2. 메시지 컨버터가 메시지를 읽을 수 있는지 확인하기 위해 canRead() 호출
    • 대상 클래스 지원여부
    • HTTP 요청의 Content-Type 미디어 타입 지원여부
  3. canRead() 조건을 만족하면 read()를 호출해서 객체 생성하고 반환
  4. HttpEntity 또는 @RequestBody가 적용된 파라미터에서 반환된 객체를 받아서 사용

 

📌 HTTP 응답 데이터 생성

 

  1. 컨트롤러에서 @ResponseBody 또는 HttpEntity 사용
  2. 메시지 컨버터가 메시지를 쓸 수 있는지 확인하기 위해 canWrite() 호출
    • 대상 클래스 지원여부
    • HTTP 요청의 Accept 미디어 타입 지원여부(@RequestMapping의 produces 옵션을 보고 Accept 확인)
  3. canWrite() 조건을 만족하면 write()를 호출해서 객체 생성하고 반환
  4. 컨트롤러에서 반환된 객체를 받아서 사용

 

Reference:

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 원

www.inflearn.com

 

'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