티스토리 뷰
무언가 다른 방식
자, 이전 포스트에서 디폴트 생성자가 없는 경우 deserializeFromObjectUsingNonDefault() 를 호출한다는 사실까지 알아보았다. 이번 포스트에서는 이 메서드가 어떻게 동작하는지, 어떤 메서드들을 호출하는지를 알아본다.
우선 JsonDeserializer<Object> 라는 역직렬화를 담당하는 클래스 (이름 상으로는) 객체의 이름을 delegateDeser 로 하고 _delegateDeserializer() 를 할당해주는 것을 볼 수 있다. 그리고 바로 밑에서 이것이 null 인지를 확인한다.
_delegateDeserializer() 는 무엇이고, null 인 경우와 아닌 경우의 차이는 무엇일까?
우선 Javadoc 에 쓰여 있는 _delegateDeserializer() 의 정의는 다음과 같다:
Deserializer that is used iff delegate-based creator is to be used for deserializing from JSON Object.
쉽게 말해서 이 녀석은 JSON 객체로부터 역직렬화하기 위해 delegate-based creator 가 사용되어야 할 때에 사용된다.
그렇다면 delegate-based creator 는 무엇일까?
우선, 많은 정보가 없어 아래 글을 참고해보았다.
https://groups.google.com/g/jackson-user/c/qL5l1mMFifM?pli=1
둘의 대화에서 알 수 있었던 점은 deserializer 은 다른 deserializer 에게 작업을 위임하는 경우가 있다는 것이다.
실제로 JsonDeserializer 클래스에는 getDelegatee() 메서드가 있는데, 현재 사용하는 deserializer 가 혹시 custom deserializer 와 같은 다른 deserializer 사용하여 역직렬화를 하고 있는지 확인하는 것이다.
다른 deserializer 가 존재하고 일을 위임받으면 @NoArgsConstructor 가 붙지 않은 상황에서도 역직렬화가 가능해진다.
디버깅을 계속 진행하자, (F7 - Step Into로 진행)
내 프로젝트의 경우에는 delegateDeserializer 가 아니라 PropertyBasedCreator 에 해당하는 것이 드러났다.
근데 나는 아무 설정도 해주지 않았는데, 어떻게 알아서 DTO에 대해 _propertyBasedCreator 를 만들어 놓은 것일까?
도대체 _propertyBasedCreator 는 무엇일까?
Bean 객체 (UserLoginRequest 와 같은) 가 하나 또는 그 이상의 알려진 Property 를 매개 변수로 받는 생성자나 팩토리 메서드를 사용해서 생성되어야 할 때 (즉, 디폴트 생성자가 없을 때) 사용된다고 한다.
이 말인즉슨, 매개변수로서 받아진 Property들이 알려져 있으면 ('named' 이면) 디폴트 생성자 없이도 역직렬화가 가능한 것이다. property based creators 와 delegate based creators 의 자세한 차이는 출처에 있는 블로그에서 확인할 수 있다.
결론
문제의 핵심에 근접하게 다다랐지만, 확실한 문제 해결은 아니었다. 다른 설정 없이 Property based creator 가 생성된다는 사실을 납득하기 어려웠다. 그래서 디버깅을 좀 더 해보기로 했다. (feat. 멋사 백엔드 스쿨 2기 회고 6팀)
디버깅의 내용은 다음 3부에서 계속 설명하도록 하겠다.
출처
https://www.cowtowncoder.com/blog/archives/2011/07/entry_457.html
'Java' 카테고리의 다른 글
DTO 의 Deserialize(역직렬화): 3부 (0) | 2022.11.30 |
---|---|
[Java] 원시 타입과 참조형 타입: 배열 생성 방법에서의 차이 (0) | 2022.11.30 |
DTO 의 Deserialize(역직렬화): 1부 (0) | 2022.11.29 |
[Java] enum type Class (0) | 2022.11.18 |
- Total
- Today
- Yesterday
- 깃랩
- LazyInitializationException
- JPA
- JPQL
- 코테
- 프로그래머스
- Spring Boot
- docker
- 지연 로딩
- ci/cd
- Firebase
- 기지국 설치
- google cloud
- DTO
- gitlab
- JOIN FETCH
- 인증/인가
- Jackson
- spring
- 실시간데이터
- 역직렬화
- 도커
- @RequestBody
- N+1
- DeSerialization
- json web token
- FCM
- 알고리즘
- 가상 서버
- Java Data Types
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |