@RequestBody 호출 시 일어나는 일을 간단히 알아보기 (feat. MessageConverter, ObjectMapper)
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/