///////
Search
🔋

Message Converter는 어느 시점에 사용되고 어떤 기능을 제공하나요?

Message Converter란

HTTP API를 제공하는 경우에는 HTTP Message Body에 JSON, XML, TEXT 형식으로 데이터를 직접 담아서 요청 및 응답을 처리한다.
Spring에서는 HttpEntity 객체나 @RequestBody, @ResponseBody 어노테이션을 사용하면 요청 및 응답 데이터를 자동으로 적절한 데이터 형식으로 변환한다
→ 위 과정을 Http Message Converter가 해준다.
인터페이스이며, canRead(), canWrite(), read(), write() 메서드가 존재
canRead(), canWrite() : 메시지 컨버터가 해당 클래스, 미디어 타입을 지원하는지 체크
read(), write() : 메시지 컨버터를 통해서 메시지를 읽거나 쓰는 기능

Message Converter 사용 시점

Spring MVC에서 다양한 타입의 인자값을 적절한 데이터로 매핑해야한다
ArgumentResolver, ReturnValueHandler에서 Message Converter를 사용
요청 인자값을 ArgumentResolver가 처리
응답 인자값을 ReturnValueHandler가 처리

Message Converter 동작 과정

HTTP 요청 데이터 읽는 과정

1.
@RequestBody 또는 HttpEntity 파라미터를 사용한다.
2.
메시지 컨버터가 메시지를 읽을 수 있는지 확인하기 위해서 canRead()를 호출
a.
대상 클래스 타입을 지원하는가?
ex) byte[]String, 객체 또는 HashMap
b.
HTTP 요청의 Content-Type 미디어 타입을 지원하는가?
ex) text/plain, application/json, */*
3.
canRead()에서 조건 1과 2를 만족하면, read()를 호출해서 객체를 반환

HTTP 응답 데이터 생성 과정

1.
@ReponseBody 또는 HttpEntity로 값을 변환한다.
2.
메시지 컨버터가 메시지를 쓸 수 있는지 확인하기 위해서 canWrite()를 호출
a.
리턴 대상 클래스 타입을 지원하는가?
b.
HTTP 요청의 Accept 미디어 타입을 지원하는가?
3.
canWrite()에서 조건 1과 2를 만족하면, write()를 호출해서 HTTP 응답 메시지 바디에 데이터를 생성

한 줄 정리

Message Converter는 @RequestBody , @ResponseBody 를 통해 Http 요청, 응답 시 데이터를 매핑할 필요 없이 적절한 데이터 형식으로 변환시켜준다. 데이터의 클래스 타입과 미디어 타입을 체크하는 canRead(), canWrite() 메서드를 제공하고, 적절한 데이터로 변환시켜주는 read(), write() 메서드를 제공한다.

참고