Spring

[Spring] HTTP 메시지 컨버터 (HttpMessageConverter)

cornarong 2021. 8. 2. 23:00

HTTP 메시지 컨버터

HTTP 메시지 컨버터란

기존의 뷰 템플릿으로 HTML을 생성해서 응답하는 것이 아니라 HTTP API(REST API)처럼 JSON형식의 데이터 메시지바디를 직접 읽거나 쓰기 위해 메시지 본문을 다루는 방식을 말한다.

 

스프링 MVC는 다음의 경우에 HTTP 메시지 컨버터를 적용한다.
HTTP 요청: @RequestBody , HttpEntity(RequestEntity)
HTTP 응답: @ResponseBody , HttpEntity(ResponseEntity)

 

기존의 요청 URL 파라미터, HTML Form방식에서의 viewResolver대신 HttpMessageConverter이 동작하게 된다.

 

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

1. ByteArrayHttpMessageConverter
2. StringHttpMessageConverter
3. MappingJackson2HttpMessageConverter

 

대상 클래스 타입과 미디어 타입 둘을 체크해서 사용여부를 결정한다. 

만약 만족하지 않으면 다음 메시지 컨버터로 우선순위가 넘어간다.

(아래의 컨버터 인터페이스로 확인할 수 있다.)

 

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();

	default List<MediaType> getSupportedMediaTypes(Class<?> clazz) {
		return (canRead(clazz, null) || canWrite(clazz, null) ?
				getSupportedMediaTypes() : Collections.emptyList());
	}

	T read(Class<? extends T> clazz, HttpInputMessage inputMessage)
			throws IOException, HttpMessageNotReadableException;

	void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage)
			throws IOException, HttpMessageNotWritableException;
}

메시지 컨버터는 canRead, canWrite 둘다 사용이 가능하다. = 양방향 지원을 한다.

 

* canRead() , canWrite() : 메시지 컨버터가 해당 클래스, 미디어타입을 지원하는지 체크
* read() , write() : 메시지 컨버터를 통해서 메시지를 읽고 쓰는 기능

 

순서 : canRead() -> read()

 

HTTP 요청 시
메시지 컨버터가 메시지를 읽을 수 있는지 확인하기 위해 canRead() 를 호출한다.
1. 대상 클래스 타입을 지원하는가. 예) @RequestBody 의 대상 클래스 ( byte[] , String , HelloData )
2. HTTP 요청의 Content-Type 미디어 타입을 지원하는가. 예) text/plain , application/json , */*
canRead() 조건을 만족하면 read() 를 호출해서 객체 생성하고, 컨트롤러에 반환한다.

 

HTTP 응답 시

메시지 컨버터가 메시지를 쓸 수 있는지 확인하기 위해 canWrite() 를 호출한다.
1. 대상 클래스 타입을 지원하는가. 예) return의 대상 클래스 ( byte[] , String , HelloData )
2. HTTP 요청의 Accept 미디어 타입을 지원하는가. 예) text/plain , application/json , */*
canWrite() 조건을 만족하면 write() 를 호출해서 HTTP 응답 메시지 바디에 데이터를 생성한다.

 

 

 

 

 

 

 


Reference

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