본문 바로가기

Java/Java

[Java] Json 기본 생성자 없이 역직렬화 하기

개발을 하다보면, 아래와 같은 예외로그를 심심치 않게 마주할 수 있습니다.

 

역 직렬화 과정중 기본 생성자를 찾을 수 없어서 발생하는 예외

 

위 예외는 역직렬화 과정중에 기본 생성자를 찾을 수 없어서 발생하는 예외 인데요, Spring Boot Web 2.X 이후부터는 설정이 추가되어서 기본 생성자 없이 역직렬화가 가능하지만, 간혹가다 Spring Boot Web 에서 등록해주는 ObjectMapper를 사용하기 힘들때가 있습니다. 생성자에 @JsonCreator를 매핑하거나, 파라미터에 @JsonProperty를 전부 매핑해주면 쉽게 해결이 가능하지만.. 관리포인트가 한군데 더 생기며, 후술할 방식에 비해서 보일러 플레이트가 늘어나기 때문에 선호하는 방식은 아닙니다.

 

스프링과 같이 기본생성자를 통해 역직렬화를 하기 위해선 어떻게 해야할까요?

Jackson에서는 Jackson 2.4 버전(버전은 확실하지 않습니다.)부터 Jackson Module Parameter Names 모듈을 제공하고 있습니다.

이 모듈을 사용하면, @JsonProperty 어노테이션을 사용할 필요없이, 팩토리 메소드나 생성자를 감지해줍니다.

https://github.com/FasterXML/jackson-modules-java8

설정 방법

모듈을 사용하기위해 아래사진과 같이 jackson-module-parameter-names 를 추가로 설정해줬습니다. 만약, spring-boot-web 의존성이 이미 설정되어 있으시다면, 모듈이 이미 같이 추가되어있으니 따로 설정해주지 않으셔도 됩니다.

두번째줄이 설정입니다.

 

이제, ObjectMapper를 생성할때 위 모듈을 등록해주면 되는데요, 등록을 위해 ObjectMapper.register 메소드를 사용하면 됩니다.

아래사진은 각각 Kotlin, Java로 작성된 설정 사진입니다. 

 

Kotlin config
Java config

 

이렇게 설정해주시면, 기본생성자 없이 잘 동작하는것을 확인하실 수 있으실 겁니다.

마치며

아주 가끔 커스텀한 ObjectMapper를 등록해줘야 할때마다 방법을 까먹고 찾아보는데 인터넷에는 @JsonCreator를 이용한 방식이 대부분이더군요. 이 방식보다는 모듈을 등록하는 방식을 선호해서.. 매번 찾아보지 않기 위해 정리했습니다 :)

 

최신버전은 https://mvnrepository.com/artifact/com.fasterxml.jackson.module/jackson-module-parameter-names 에서 확인할 수 있습니다.

'Java > Java' 카테고리의 다른 글

[Java] Future.cancel() vs CompletableFuture.cancel()  (0) 2023.02.15
[Java] 스레드와 Synchronized  (0) 2021.10.25
[Java] Java Heap Stack Static  (0) 2021.10.23
[Java] compareTo  (0) 2021.05.05
[Java] Wrapper Class  (0) 2021.05.02