FireDrago

[Spring] HttpMessageConverter 본문

프로그래밍/Spring

[Spring] HttpMessageConverter

화이용 2024. 2. 1. 14:04

HTTP API 에서 HTTP 바디에 데이터가 담겨오는 경우, 혹은 데이터를 담아서 응답해야 하는경우에

HttpMessageConverter가 사용된다. 자세히 살펴보자

 

1. HttpMessageConverter

 HttpMessageConverter는 요청과 응답 모두 사용된다.

 - @RequestBody, HttpEntity가 요청에서 사용될때

 - @ResponseBody, HttpEntity가 응답에서 사용될때 

 

Http 바디에 데이터를 담아서 응답하지 않는 경우, Spring은 ViewResolver 를 사용하여 View 객체를 생성하지만,

Http 바디에 데이터를 담아야 할때는 HttpMessageConverter를 사용한다.  

ReturnValueHandler 가 컨트롤러의 반환값에 @ResponseBody , HttpEntity(ResponseEntity) 를 사용하면,

HttpMessageConverter를 통해 HTTP 응답을 직접 생성한다.

 

@ResponseBody 애너테이션이 사용되면 HttpMessageConveter 호출

 

요청시에는 그럼 어떻게 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