참새의 이야기
[MVC1] HTTP 메시지 컨버터 본문
HTTP 메시지 컨버터는 언제 사용하는가
HTML 같은 뷰 템플릿을 생성해서 response 하는 것이 아니라 JSON 형식의 데이터를 처리하는 경우에는 HTTP 메시지 컨버터를 사용한다.
좀 더 간단하게는 아래와 같은 경우로 정리할 수 있다.
- HTTP request: @RequestBody, HttpEntity(RequestEntity)
- HTTP response: @ResponseBody, HttpEntity(ResponseEntity)
동작 원리
HTTP request
request가 오면 메시지 컨버터의 canRead() 메서드를 호출한다.
canRead() 메서드가 읽을 수 있다고 판단한다면 read() 메서드를 호출하여 처리한다.
canRead() 메서드가 읽을 수 없다고 판단한 경우에는 다음 우선순위의 메시지 컨버터에게 처리를 요청한다.
HTTP response
request의 경우와 크게 다르지 않다.
컨트롤러가 반환한 값이 @RequestBody, HttpEntity(RequestEntity)라면 메시지 컨버터의 canWrite() 메서드를 호출한다.
canWrite() 메서드가 쓸 수 있다고 판단한다면 write() 메서드를 호출하여 처리한다.
canWrite() 메서드가 쓸 수 없다고 판단한다면 다음 우선순위의 메시지 컨버터에게 처리를 요청한다.
HttpMessageConverter
HttpMessageConverter는 interface이므로 여러 구현체가 있다.
아래의 세 가지가 주로 쓰이는 것으로, 우선순위대로 나열했다.
- ByteArrayHttpMessageConverter
- StringHttpMessageConverter
- MappingJackson2HttpMessageConverter
메시지 컨버터는 누가 호출하나
지금까지 메시지 컨트롤러는 언제 사용되고, 어떻게 동작하는지를 알아봤다.
그렇다면 메시지 컨트롤러는 누가 호출하는 것일까?
DispatcherServlet을 통해 handler로 가는 request는 RequestMappingHandlerAdapter를 거쳐간다.
Handler를 호출하는 것이 RequestMappingHandlerAdapter인데, 파라미터를 ArgumentResolver를 통해 handler에게 전달한다.
이때 ArgumentResolver는 HTTP 메시지 컨버터를 이용하여 필요한 객체를 생성하고 이를 컨트롤러에게 전달한다.
ArgumentResolver가 있기 때문에 컨트롤러는 다양한 파라미터를 받아들일 수 있다.
응답의 경우, 컨트롤러는 ReturnValueHandler를 통해 RequestMappingHandlerAdapter에게 응답을 보낸다.
ReturnValueHandler는 받은 데이터를 HTTP 메시지 컨버터를 통해 응답 결과로 만들어 RequestMappingHandlerAdapter에게 전달한다.
정리하자면, HTTP 메시지 컨버터를 호출하는 것은 ArgumentResolver 혹은 ReturnValueHandler인 것이다.
reference
이 글은 김영한님의 '스프링 MVC 1편'을 듣고 작성했습니다.
'Spring' 카테고리의 다른 글
[MVC2] Thymeleaf - 기본 (0) | 2023.08.05 |
---|---|
[MVC1] 데이터 담아 Redirect하기 (2) | 2023.08.04 |
[MVC1] 스프링 MVC Response (0) | 2023.08.04 |
[MVC1] 스프링 MVC Request (4) | 2023.08.04 |
[MVC1] Slf4j를 사용한 logging (0) | 2023.08.03 |