[Spring MVC] @RequestBody 동작 원리 [1] — Http Message Converter

tae.kwon.v
taekwon-v
Published in
5 min readFeb 3, 2023

@RequestBody 는 클라이언트 측에서 보낸 데이터를 (Java) 오브젝트로 만들어주는 역할을 담당한다. 이번 글에서는 직렬화 / 역직렬화의 개념과 Spring MVC 에서 직렬화 과정을 지원하는 Http Message Converter 에 대해 다룰 예정이다.

| 직렬화 / 역직렬화

본론을 다루기 전에 먼저 배경 지식인 직렬화 / 역직렬화 에 대해서 간단히 이해하고 넘어가보자.

[ 그림 1 ]

먼저 직렬화 는 오브젝트를 문자열 또는 바이트 스트림으로 변환하는 것을 의미한다. 직렬화를 하는 주된 목적으로는 오브젝트를 데이터베이스, 파일, 캐시 등에 저장하기 위해 연속적인(Serial) 데이터로 변환하는 것에 있다.

[ 그림 2 ]

반대로 역직렬화 는 문자열 또는 바이트 스트림을 다시 오브젝트로 변환하는 것을 의미한다. 직렬화를 사용하는 주된 목적의 연장선에서 보면, 데이터베이스에 저장된 바이트 스트림을 기반으로 다시 오브젝트를 생성할 때 사용한다는 것을 쉽게 이해할 수 있다.

[ 그림 3 ]

[ 그림 3 ] 에서는 위에서 설명한 직렬화, 역직렬화가 일어나는 일련의 과정을 보여준다.

그렇다면, 앞서 서론에서 언급한 상황 속에서 (클라이언트 측의 데이터 전송) 우리가 주로 확인할 과정은 직렬화, 역직렬화 중 어떤 것일까? @RequestBody 어노테이션을 선언하면 이를 통해 클라이언트 측에서 보낸 데이터를 (Java) 오브젝트로 만들어주므로 우리가 주목할 부분은 역직렬화 과정이다.

| Http Message Converter

Http Message ConverterHTTP 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 — Default Message Converters ]

[ 그림 4 ] 는 Spring MVC 에서 제공하는 Default Message Converters 를 보여준다. [ 그림 4 ] 의 리스트에 저장된 순서대로 미디어 타입과 대상 클래스 타입을 기준에 맞는 메시지 컨버터를 찾는다.

다음 글에서는 Http Message Converter 내부의 역직렬화 과정에서 활용되는 Object MapperSpring MVC 에서 HTTP 요청을 처리하는 과정 속에서 Http Message Converter 가 어떤 위치에서 작동되는지를 다룰 예정이다.

--

--