일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- emqx
- CentOS
- 카프카
- 항해99
- AWS
- 스웨거
- 남궁성과 끝까지 간다
- docker
- 프로그래머스
- 개인프로젝트
- 스프링의 정석
- JavaScript
- visualvm
- EC2
- WEB SOCKET
- 스파르타코딩클럽
- Spring Security
- 패스트캠퍼스
- MYSQL
- 쇼트유알엘
- Kafka
- JWT
- DB
- 웹개발
- 데이터베이스
- java
- 생성자 주입
- @jsonproperty
- Spring
- 시큐리티
- Today
- Total
Nellie's Blog
@RequestBody 호출 시 일어나는 일을 간단히 알아보기 (feat. MessageConverter, ObjectMapper) 본문
@RequestBody 호출 시 일어나는 일을 간단히 알아보기 (feat. MessageConverter, ObjectMapper)
Nellie Kim 2023. 12. 6. 17:24
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/
'Back-end > java' 카테고리의 다른 글
[Java] 동시성 이슈를 유발해보고 해결하기 (feat. VisualVM, synchronized) (0) | 2024.12.14 |
---|---|
스트림의 중간연산과 최종연산 목록 표 (0) | 2024.01.01 |
AOP를 사용하여 에러 로그 찍기 (0) | 2023.09.26 |
로컬 디스크에 자바 로깅 기록하기 (spring.log) (0) | 2023.09.26 |
완전 간단하게 AOP로 log찍기 (0) | 2023.09.26 |