HTTP 메시지 컨버터란?
JSON 데이터를 HTTP 메시지 바디에서 직접 읽거나 쓰는 경우, HTTP 메시지 컨버터를 사용하면 매우 편리하다.
HTTP 메시지 컨버터란, 요청 본문에서 메시지를 읽어들이거나(@RequestBody), 응답 본문에 메시지를 작성할 때(@ResponseBody) 사용하는 컨버터다.
HTTP 메시지 컨버터 인터페이스
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, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException;
- HTTP 요청, 응답 양방향으로 사용
- canRead(), canWrite(): 메시지 컨버터가 해당 클래스, 미디어 타입을 지원하는지 체크
- read(), write(): 메시지 컨버터를 통해 메시지를 읽고 쓰는 기능
스프링 부트의 기본 메시지 컨버터
ByteArrayHttpMessageConverter StringHttpMessageConverter MappingJacksonHttpMessageConverter ... |
- 기본적으로 위의 컨버터들을 지원함
- 대상 클래스 타입과 미디어 타입을 체크해 사용여부 결정
(만족하지 않는 경우 다음 메시지 컨버터로 우선순위 넘어감) - ex1: @RequestBody String data 형식으로 요청이 오면 StringHttpMessageConverter 사용
- ex2: @ResponseBody return helloData로 쓰고 미디어 타입 application/json인 경우 MappingJacksonHttpMessageConverter 사용
HTTP 요청 데이터 읽기
- HTTP 요청이 들어오고, 컨트롤러에서 @RequestBody나 HttpEntity 파라미터 사용
- 메시지 컨버터가 canRead() 호출 // 읽을 수 있는 메시지인지 확인
- 대상 클래스 타입과 HTTP의 Content-Type 미디어 타입 지원하는지 - canRead() 만족 시 read() 호출해 객체 생성 및 반환
HTTP 응답 데이터 생성
- 컨트롤러에서 @ResponseBody나 HttpEntity로 값 반환
- 메시지 컨버터가 canWrite() 호출 // 메시지를 쓸 수 있는지 확인
- 대상 클래스 타입과 HTTP의 Accept 미디어 타입 지원하는지 - canWrite() 만족 시 write() 호출해 HTTP 응답 메시지 바디에 데이터 생성
HTTP 메시지 컨버터의 실행
그렇다면 이제 궁금한 것이 하나 생겼다.
HTTP 메시지 컨버터는 어디서 실행되는걸까?
SpringMvc 구조를 다시 보자
- HTTP 요청이 들어오면 핸들러 조회
- 핸들러를 처리할 수 있는 핸들러 어댑터 조회
- handle(handler)
- handler 호출
- ModelAndView 반환
- viewResolver 호출
- View 반환
- render(model) 호출
위 과정에서 4번 과정을 주목해보자.
어노테이션 기반의 핸들러(컨트롤러)의 여러 파라미터를 생성해서 호출할 수 있는 '핸들러 어댑터'
이 어댑터가 HTTP 메시지 컨버터와 관련이 있다.
먼저, @RequestMapping을 처리하는 핸들러 어댑터인 RequestMappingHandlerAdapter를 자세히 살펴보자.
- ArgumentResolver 호출
ArgumentResolver: 매우 다양한 종류의 파라미터를 유연하게 처리해 파라미터 값(객체) 생성 - 파라미터 값이 준비되면 컨트롤러를 호출하며 값을 넘겨줌
그럼 이제 본격적으로 HTTP 메시지 컨버터는 어디있을까?
만약 ArgumentResolver에 요청하는 파라미터가 @RequestBody 또는 HttpEntity인 경우 HTTP 메시지 컨버터를 사용해 'read' 한다. 응답의 경우에도 @ResponseBody 또는 HttpEntity를 처리하는 ReturnValueHandler에서 HTTP 메시지 컨버터를 호출해 응답 결과를 'write' 한다.\
출처 : 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
'Backend > Spring MVC' 카테고리의 다른 글
[Spring MVC] 쿼리 파라미터, 쿼리스트링, 패스변수 (Query parameter, Query String , Path Variable) (0) | 2023.03.20 |
---|---|
[Spring MVC] RequestMapping (0) | 2023.03.16 |
[Spring MVC] Servlet 기반의 MVC 패턴의 단점과 보완방법 (0) | 2023.03.13 |
[Spring MVC] MVC 패턴 적용 (Servlet 기반) (0) | 2023.03.09 |
[Spring MVC] MVC 패턴 (0) | 2023.03.08 |