본문 바로가기

새롭게 쌓은 지식

@RequestBody 의 작동원리

 

@RequestBody 애너테이션의 역할은 클라이언트가 보내는 HTTP 요청 Body(JSON 및 XML 등)를 Java 오브젝트로 변환하는 것입니다. HTTP 요청 Body는 Spring에서 제공하는 HttpMessageConverter를 통해 타입에 맞는 객체로 변환됩니다

 

 

Controller.java

 

RequestBodyDto.java

이렇게 하면 요청의 JSON 데이터가 자바 객체인 RequestBodyDto 의 각 필드에 파싱이 정상적으로 된다.

 

 

 

 

Setter 없이 Getter 만 있는 경우

 

이렇게 해도 RequestBodyDto 의 각 필드에 파싱이 정상적으로 된다.

 

@RequestBody는 어떻게 기본 생성자만을 가지고 JSON 값을 Java 객체로 재구성할 수 있었던 것일까요?

 

 

 

 

 

 

 

MappingJackson2HttpMessageConverter

 

org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver 클래스의 readWithMessageConverters()라는 메서드에 브레이크 포인트를 찍고 다시 Post 요청을 보내보았습니다.

 

 

 

 

Spring에 등록된 여러 MessageConverter 중 MappingJackson2HttpMessageConverter의 readJavaType 메서드를 타고 들어가다 보면 내부적으로 ObjectMapper를 통해 JSON 값을 Java 객체로 역직렬화하는 것을 알 수 있습니다. 역직렬화란 생성자를 거치지 않고 리플렉션을 통해 객체를 구성하는 메커니즘이라고 이해하면 되겠습니다. 직렬화 가능한 클래스들은 기본 생성자가 항상 필수입니다. 따라서 @RequestBody에 사용하려는 RequestBodyDto가 기본 생성자를 정의하지 않으면 데이터 바인딩에 실패합니다.

 

 

 

 

 

그렇다면 어떻게 ObjectMapper는 JSON의 필드명 Key를 Java 객체의 필드명과 매핑시킬까?

 

 

 

공식 문서에 따르면, Jackson ObjectMapper는 JSON 오브젝트의 필드를 Java 오브젝트의 필드에 맵핑할 때 getter 혹은 setter 메서드를 사용한다고 합니다. getter나 setter 메서드 명의 접두사(get, set)를 지우고, 나머지 문자의 첫 문자를 소문자로 변환한 문자열을 참조하여 필드명을 알아냅니다.

 

 

 

 

정리

 

- @RequestBody 를 사용하면 요청 본문의 JSON, XML, Plain Text 등의 데이터가 적합한 HttpMessageConverter를 통해 파싱 되어 Java 객체로 변환된다.

- @RequestBody를 사용할 객체는 필드를 바인딩할 생성자나 Setter 메서드가 필요 없다.

     다만 직렬화를 위해 기본 생성자는 필수이다.

     또한 데이터 바인딩을 위한 필드명을 알아내기위해 Getter 나 Setter 중 1가지는 정의되어 있어야한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

참고자료

 

@RequestBody vs @ModelAttribute

1. @RequestBody와 @ModelAttribute Controller.java @RequestBody와 @ModelAttribute는 클라이언트 측에서 보낸 데이터를 Java…

tecoble.techcourse.co.kr

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

꾸준히 다시보자.

 

1. 221004

2. 221015

3. 221030

Recent Posts
Popular Posts
Recent Comments