Back-end/java

@RequestBody 호출 시 일어나는 일을 간단히 알아보기 (feat. MessageConverter, ObjectMapper)

Nellie Kim 2023. 12. 6. 17:24
728x90

 

Http 요청 시 항상 보게되는 @RequestBody 어노테이션이 있다. @ModelAttribute 어노테이션과 항상 비교되는 어노테이션이다.  오늘은 @RequestBody만 딥하게 파보도록 하겠다.

 

지금까지는 @RequestBody를 '스프링 내부의 리플렉션으로 매핑을 해주며 JSON으로 요청이 가능하고 자바객체로 역직렬화를 해준다' 라고만 알고있었다.  더 들어가보자.


 

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

 

1. HttpMessageConverter 이동

@RequestBody  요청 시 먼저 HttpMessageConverter 로 들어가게 된다.

여러 HttpMessageConverter 중에서 MappingJackson2HttpMessageConverter를 사용한다.

 

readWithMessageConverters()라는 메서드에 브레이크 포인트를 찍고 Post 요청을 보내고 디버깅으로 파고 들어가면 아래와 같이 MappingJackson2HttpMessageConverter를 사용하고, 내부적으로 또 ObjectMapper를 통해 JSON값을 JAVA객체로 역직렬화 하는 것을 볼 수 있다. 

 

 

2. ObjectMapper 로 JSON → java객체 변환 (역직렬화)

더 타고 들어가보면,

HttpMessageConverter 내부의 ObjectMapper JSON → java객체 변환을 시켜주는 것을 확인할 수 있다.

 

 

 

역직렬화 과정을 알아보자.

ObjectMapper가 어떻게 JSON으로 자바객체를 만들어주는데?!

 

    1. 기본생성자로 객체를 먼저 생성한다. 

    2. 필드값을 찾아서 바인딩 (public 형태의 getter/setter 메소드로 찾음) 해준다.

 

즉, @RequestBody 어노테이션을 사용할 때에는 기본생성자 & getter 또는 setter 메소드는 필수로 있어야한다!

그래야 ObjectMapper 가 당황하지 않고 역직렬화를 잘 해서 객체를 생성할 수 있겠지?! 😊

 

이게 끝이다. 참 쉽쥬?


역직렬화란?

생성자를 거치지 않고 리플렉션을 통해 객체를 구성하는 매커니즘이다. JSON → java객체 

 

직렬화란?

직렬화는 객체를 일련의 바이트 스트림 또는 다른 형식(JSON 등.. )으로 변환하는 과정을 말한다. Java 객체 → JSON

 

리플렉션이란?

'java.lang.reflect' 패키지에서 제공하며, 프로그램 구조를 동적으로 분석하고 조작할 수 있다.

실행 중인 프로그램의 클래스, 인터페이스, 필드, 메서드 등의 정보를 얻어내거나 수정하는데 사용되는 자바의 특성이다.

 

 

 

https://steady-hello.tistory.com/124

https://tecoble.techcourse.co.kr/post/2021-05-11-requestbody-modelattribute/

 

@RequestBody 호출 시 일어나는 일을 간단히 알아보기.pdf
1.29MB