HTTP 메시지 컨버터가 적용되는 경우
HTTP 요청: @RequestBody , HttpEntity(RequestEntity)
HTTP 응답: @ResponseBody , HttpEntity(ResponseEntity)
스프링 부트 기본 메시지 컨버터
(순서대로 대상 클래스 타입과 미디어 타입 둘을 체크하여 사용 여부를 결정)
0 = ByteArrayHttpMessageConverter
1 = StringHttpMessageConverter
2 = MappingJackson2HttpMessageConverter
ByteArrayHttpMessageConverter : byte[] 데이터를 처리한다.
- 클래스 타입: byte[], 미디어 타입 : */*
- 요청 : @ReqeustBody byte[] data
- 응답 : @ResponseBody return byte[] 쓰기 미디어타입 application/octet-stream
StringHttpMessageConverter : String문자로 데이터를 처리
- 클래스 타입 : String, 미디어타입: */*
- 요청 : @RequestBody String data
- 응답 : @ResponseBody return "ok" 쓰기 미디어타입 text/plain
MappingJackson2HttpMessageConverter : application/json
- 클래스 타입 : 객체 또는 HashMap, 미디어타입 application/json
- 요청 : @RequestBody HelloData data
- 응답 : @ResponseBody return hellodata 쓰기 미디어타입 application/json
HTTP 요청 데이터 읽기
HTTP 요청이 오고, 컨트롤러에서 @RequestBody , HttpEntity 파라미터를 사용한다.
메시지 컨버터가 메시지를 읽을 수 있는지 확인하기 위해 canRead() 를 호출한다.
- 대상 클래스 타입을 지원하는가 : 예) @RequestBody의 대상 클래스 ( byte[] , String , HelloData )
- HTTP 요청의 Content-Type 미디어 타입을 지원하는가 : 예) text/plain , application/json , */*
canRead() 조건을 만족하면 read() 를 호출해서 객체 생성하고, 반환한다.
HTTP 응답 데이터 생성
컨트롤러에서 @ResponseBody , HttpEntity 로 값이 반환된다.
메시지 컨버터가 메시지를 쓸 수 있는지 확인하기 위해 canWrite() 를 호출한다.
- 대상 클래스 타입을 지원하는가 : 예) return의 대상 클래스 ( byte[] , String , HelloData )
- HTTP 요청의 Accept 미디어 타입을 지원하는가.(더 정확히는 @RequestMapping 의 produce) 예) text/plain , application/json , */*
canWrite() 조건을 만족하면 write() 를 호출해서 HTTP 응답 메시지 바디에 데이터를 생성한다.
요청 매핑 핸들러 어댑터 구조
우리는 컨트롤러 사용 시에 매우 다양한 파라미터를 자유자재로 사용할 수 있었다. 그 이유는? Argument Resolver다.
Argument Resolver : 컨트롤러의 매우 다양한 파라미터를 유연하게 처리해줌
애노테이션 기반 컨트롤러를 처리하는 RequestMappingHandlerAdaptor는 바로 이 ArgumentResolver를 호출해서 컨트롤러(핸들러)가 필요로 하는 다양한 파라미터의 값(객체)을 생성한다. 그리고 이렇게 파리미터의 값이 모두 준비되면 컨트롤러를 호출하면서 값을 넘겨준다.
*스프링에는 30개가 넘는 Argument Resolver를 제공한다.
ReturnValue Handler : 응답 값을 변환하고 처리함. 컨트롤러에서 String으로 뷰 이름을 반환해도 동작이 되는 이유다.
HTTP 메시지 컨버터의 위치
그리고 HTTP 메시지 컨버터는 아래와 같은 위치에 존재하고 있다.
- 요청의 경우
@RequestBody, HttpEntity를 처리하는 Argument Resolver가 각각 존재하고 그 Argument Resolver들이 HTTP 메시지 컨버터를 이용해서 필요한 객체를 생성
- 응답의 경우
@ResponseBody, HttpEntity를 처리하는 Argument Resolver가 각각 존재하고 그 Argument Resolver들이 HTTP 메시지 컨버터를 이용해서 응답 결과를 만단다.
* 참고 :
@RequestBody, @ResponseBody를 처리할 때는 RequestResponseBodyMethodProcessor (ArgumentResolver)
HttpEntity를 처리할 때는 HttpEntityMethodProcessor (ArgumentResolver)를 사용한다.
---------------
참고: 인프런 김영한님 강의(스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술)
댓글