본문 바로가기
Backend, Server/Spring MVC

[Spring MVC] HTTP 메시지 컨버터, 요청 매핑 핸들러 어댑터 구조

by ggyongi 2022. 1. 19.
반응형

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편 - 백엔드 웹 개발 핵심 기술)

 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글