티스토리 뷰

Java

DTO 의 Deserialize(역직렬화): 2부

Nickolodeon 2022. 11. 30. 01:31

무언가 다른 방식

자, 이전 포스트에서 디폴트 생성자가 없는 경우 deserializeFromObjectUsingNonDefault() 를 호출한다는 사실까지 알아보았다. 이번 포스트에서는 이 메서드가 어떻게 동작하는지, 어떤 메서드들을 호출하는지를 알아본다.

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 

 

Calling default deserializers from customer deserializer

On Sun, Aug 20, 2017 at 1:48 PM, Vladimir <vsuts...@gmail.com> wrote: > > Thank you for the response once again. > > As you suggested I am using "findNonContextualValueDeserializer" to locate > deserializer for a given type I expect. > > JsonNode eventNode

groups.google.com

둘의 대화에서 알 수 있었던 점은 deserializer 은 다른 deserializer 에게 작업을 위임하는 경우가 있다는 것이다.

실제로 JsonDeserializer 클래스에는 getDelegatee() 메서드가 있는데, 현재 사용하는 deserializer 가 혹시 custom deserializer 와 같은 다른 deserializer 사용하여 역직렬화를 하고 있는지 확인하는 것이다.

다른 deserializer 가 존재하고 일을 위임받으면 @NoArgsConstructor 가 붙지 않은 상황에서도 역직렬화가 가능해진다.

 

 

디버깅을 계속 진행하자, (F7 - Step Into로 진행)

내 프로젝트의 경우에는 delegateDeserializer 가 아니라 PropertyBasedCreator 에 해당하는 것이 드러났다.

디버깅을 하면서 나의 DTO 의 _propertyBasedCreator 는 null 이 아닌 것을 알게 되었다.
_deserializeUsingPropertyBased() 가 구현된 코드이다.

근데 나는 아무 설정도 해주지 않았는데, 어떻게 알아서 DTO에 대해 _propertyBasedCreator 를 만들어 놓은 것일까?

도대체 _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

 

Jackson Annotations: @JsonCreator demystified

One of more powerful features of Jackson is its ability to use arbitrary constructors for creating POJO instances, by indicating constructor to use with @JsonCreator annotation. A simple explanation of this feature can be found from FasterXML wiki; but it

www.cowtowncoder.com

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함