FireDrago
[Spring] HttpMessageConverter 본문
HTTP API 에서 HTTP 바디에 데이터가 담겨오는 경우, 혹은 데이터를 담아서 응답해야 하는경우에
HttpMessageConverter가 사용된다. 자세히 살펴보자

1. HttpMessageConverter
HttpMessageConverter는 요청과 응답 모두 사용된다.
- @RequestBody, HttpEntity가 요청에서 사용될때
- @ResponseBody, HttpEntity가 응답에서 사용될때
Http 바디에 데이터를 담아서 응답하지 않는 경우, Spring은 ViewResolver 를 사용하여 View 객체를 생성하지만,
Http 바디에 데이터를 담아야 할때는 HttpMessageConverter를 사용한다.
ReturnValueHandler 가 컨트롤러의 반환값에 @ResponseBody , HttpEntity(ResponseEntity) 를 사용하면,
HttpMessageConverter를 통해 HTTP 응답을 직접 생성한다.

요청시에는 그럼 어떻게 HttpMessageConverter 가 사용된다는 걸까?
먼저 RequestMappingHandlerAdapter 를 살펴봐야 한다.
이 어댑터는 애너테이션을 사용하는 컨트롤러에사용되는 어댑터이다.
애너테이션을 사용하는 컨트롤러는 파라미터로 매우 다양한 데이터를 받을 수 있다.
ModelAndView, Model, @RequestParam, @ModelAttribute, @RequestBody, HttpEntity .... 등등
어떻게 이 많은 파라미터를 받을 수 있을까?

위의 그림처럼 RequestMappingHandlerAdapter 는 컨트롤러에 필요한 파라미터를 ArgumentResolver를 통해 받는다.
ArgumentResolver는 @RequestBody, HttpEntity 가 파라미터에 있을경우,
HttpMessageConverter를 호출하여 파라미터 객체를 생성한다.
요청시에는 ArgumentResolver가 HttpMessageConverter를 호출하여 파라미터를 생성하고
응답시에넌 ReturnValueHandler가 HttpMessageConverter를 호출하여 HTTP 응답을 생성한다.
2.HttpMessageConverter 구조

HttpMessageConverter는 요청시 canRead 를, 응답시 canWrite를 호출한다.
두 메서드는 공통적으로 Class 와 MediaType을 매개변수로 받는다.
이는 HttpMessageConverter 가 메서드의 타입과 HTTP 메세지의 ContentsType 을 확인하기 때문이다.
ContentsType : application/json
@RequestMapping
void hello(@RequestBody HelloData data) {}
이라면 Json메세지를 담당하는 구현체 MappingJackson2HttpMessageConverter가 사용되는 방식이다.
클래스 타입과 컨텐츠타입을 처리 할 수 있는 HttpMessageConverter를 찾으면, read, write 메서드를 호출하여
파라미터 객체를 생성하거나, Http 메세지를 작성한다.
3.HttpMessageConverter 종류
대표적으로 많이 사용되는 HttpMessageConverter 종류를 살펴보자
| HttpMessageConverter | 처리하는 데이터 타입 | 처리하는 미디어 타입 |
| ByteArrayHttpMessageConverter | byte[] | */* |
| StringHttpMessageConverter | String | */* |
| MappingJackson2HttpMessageConverter | 객체 또는 HashMap | application/json |
1. ByteArrayHttpMessageConverter : byte[] 데이터를 처리한다.
클래스 타입: byte[] , 미디어타입: */* ,
요청 예) @RequestBody byte[] data
응답 예) @ResponseBody return byte[] 쓰기 미디어타입 application/octet-stream
2. StringHttpMessageConverter : String 문자로 데이터를 처리한다.
클래스 타입: String , 미디어타입: */*
요청 예) @RequestBody String data
응답 예) @ResponseBody return "ok" 쓰기 미디어타입 text/plain
3. MappingJackson2HttpMessageConverter : application/json
클래스 타입: 객체 또는 HashMap , 미디어타입 application/json 관련
요청 예) @RequestBody HelloData data
응답 예) @ResponseBody return helloData 쓰기 미디어타입 application/json 관련
'프로그래밍 > Spring' 카테고리의 다른 글
| [Spring] Bean Validation (0) | 2024.02.12 |
|---|---|
| [Spring] 검증처리 (0) | 2024.02.09 |
| [Spring] Spring 기본기능 (0) | 2024.01.30 |
| [Spring] Spring MVC 기본구조 (0) | 2024.01.26 |
| [Spring] 빈 생명주기 콜백 (0) | 2024.01.11 |
