[Spring MVC] @RequestBody 동작 원리 [1] — Http Message Converter
@RequestBody
는 클라이언트 측에서 보낸 데이터를 (Java) 오브젝트로 만들어주는 역할을 담당한다. 이번 글에서는 직렬화 / 역직렬화의 개념과 Spring MVC
에서 직렬화 과정을 지원하는 Http Message Converter
에 대해 다룰 예정이다.
| 직렬화 / 역직렬화
본론을 다루기 전에 먼저 배경 지식인 직렬화 / 역직렬화
에 대해서 간단히 이해하고 넘어가보자.
먼저 직렬화
는 오브젝트를 문자열 또는 바이트 스트림으로 변환하는 것을 의미한다. 직렬화를 하는 주된 목적으로는 오브젝트를 데이터베이스, 파일, 캐시 등에 저장하기 위해 연속적인(Serial) 데이터로 변환하는 것에 있다.
반대로 역직렬화
는 문자열 또는 바이트 스트림을 다시 오브젝트로 변환하는 것을 의미한다. 직렬화를 사용하는 주된 목적의 연장선에서 보면, 데이터베이스에 저장된 바이트 스트림을 기반으로 다시 오브젝트를 생성할 때 사용한다는 것을 쉽게 이해할 수 있다.
[ 그림 3 ] 에서는 위에서 설명한 직렬화, 역직렬화가 일어나는 일련의 과정을 보여준다.
그렇다면, 앞서 서론에서 언급한 상황 속에서 (클라이언트 측의 데이터 전송) 우리가 주로 확인할 과정은 직렬화, 역직렬화
중 어떤 것일까? @RequestBody
어노테이션을 선언하면 이를 통해 클라이언트 측에서 보낸 데이터를 (Java) 오브젝트로 만들어주므로 우리가 주목할 부분은 역직렬화
과정이다.
| Http Message Converter
Http Message Converter
는 HTTP Request Body
를 Java 오브젝트로 변환( 역직렬화 )하거나 Java 오브젝트를 특정 형태로 변환( 직렬화 )하는 역할을 한다. 직렬화 종류로는 CSV, XML, JSON
등이 있는데, 구조적인 데이터를 직렬화할 때 XML, JSON이 일반적으로 많이 사용되고, 최근에는 JSON이 주로 사용된다.
Spring Framework는 다양한 직렬화 종류에 맞춘 여러 Default Message Converter
를 제공한다. 예를 들어, JSON
의 경우 MappingJackson2HttpMessageConverter 를 통해서 직렬화 / 역직렬화가 진행된다.
앞서 우리는 이번 글에서 역직렬화
과정을 중점적으로 보기로 했으므로, HTTP 요청
상황 속에서 HTTP Message Converter
가 어떻게 활용 되는지 좀 더 구체적으로 확인해보자.
// [ 코드 1 - @RequestBody 사용 코드 ]
@PostMapping("/request-body")
public ResponseEntity<RequestDto> requestBody(@RequestBody RequestDto requestDto) {
return ResponseEntity.ok(requestDto);
}
// [ 코드 2 - HttpEntity 사용 코드 ]
@PostMapping("/request-body2")
public ResponseEntity<HttpEntity<RequestDto>> requestBody2(HttpEntity<RequestDto> httpEntity) {
return ResponseEntity.ok(httpEntity);
}
[ 코드 1 ] 에서 볼 수 있듯이 @RequestBody
어노테이션은 파라미터
레벨에 사용된다. HTTP 요청 시 @RequestBody
또는 HttpEntity, RequestEntity
가 사용된 경우 HTTP Message Converter
가 작동한다.
앞서 다양한 직렬화 종류가 있고, 이에 맞춰 Spring MVC
도 다양한 Http Message Converter
를 제공한다고 했었다. 직렬화 종류에 맞춰 적절한 메시지 컨버터를 활용해야 하므로 이를 결정할 기준이 필요하다. Spring MVC
에서는 클라이언트 HTTP 요청 헤더 중 Content-Type
의 값과 대상 클래스 타입(= 생성할 Java 오브젝트)을 기준으로 삼는다. 예를 들어, content-type: application/json
가 HTTP 요청에 포함되어 있는 경우, JSON
을 지원하는 메시지 컨버터인 MappingJackson2HttpMessageConverter
를 통해 역직렬화가 진행된다.
[ 그림 4 ] 는 Spring MVC
에서 제공하는 Default Message Converters
를 보여준다. [ 그림 4 ] 의 리스트에 저장된 순서대로 미디어 타입과 대상 클래스 타입을 기준에 맞는 메시지 컨버터를 찾는다.
다음 글에서는 Http Message Converter
내부의 역직렬화 과정에서 활용되는 Object Mapper
와 Spring MVC
에서 HTTP 요청을 처리하는 과정 속에서 Http Message Converter
가 어떤 위치에서 작동되는지를 다룰 예정이다.