Backend/Java

jackson 역직렬화 시 주의할 점

findmypiece 2021. 4. 14. 15:16
728x90

자바 진영에서는 json 직렬화/역직렬화시 거의 대부분 jackson 라이브러리를 사용한다. jackson은 json을 역직렬화시 생성자를 활용하고 모든 인자를 받는 생성자에 @ConstructorProperties 어노테이션이 달려있으면 해당 생성자를 역직렬화에 사용하지만 없을 경우 기본 생성자를 사용하게 된다. @ConstructorProperties 는 lombok을 이용해서 모든 인자를 받는 생성자를 생성하면 컴파일시 자동으로 붙여주던 것인데 @AllArgsConstructor, @Builder 를 사용하는 경우를 예로 들 수 있다.

 

그런데 lombok 1.16.20 이상부터는 이게 자동으로 붙지 않기 때문에 명시적으로 기본생성자를 생성해줘야 한다. 물론 기존처럼 자동으로 @ConstructorProperties 이 붙게할 순 있다. 프로젝트 root 에 lombok.config 파일일 생성해서 아래 내용을 입력해놓으면 된다. 해당 설정은 모든 인자를 받는 생성자@ConstructorProperties 어노테이션을 추가하라는 설정이다.

lombok.anyConstructor.addConstructorProperties=true

 

그런데 이것도 문제는 있다. model 클래스를 만들 때 가변값과 불변값을 구분할 경우 불변값만으로 이루어진 생성자를 만들고 해당 생성자에 @Builder 를 정의해서 사용하곤 하는데 이 때는 모든 인자를 받는 생성자 가 기본적으로 생성되지 않기 때문에 lombok.config 설정이 의미가 없어진다. 이때는 결국 역직렬화시 기본생성자를 이용할 수 밖에 없다는 말이다. 더군다나 lombok에서 @ConstructorProperties 를 자동으로 생성하지 않도록 업데이트 한 이유가 있을 것이기 때문에 위와 같이 lombok.config 를 통해 해당 설정을 커스텀 하는 것은 좋은 방법이 아닌 것 같다. 그냥 jackson 역직렬화 시 기본생성자가 반드시 필요하다고 생각하는 편이 낫다.

 

하지만 @Builder와 @NoArgsConstructor 를 그냥 클래스에 선언하면 컴파일 에러가 발생한다. 하려면 아래와 같이 인자를 받는 생성자는 별도로 생성해서 @Builder 를 적용하고 클래스 쪽에 @NoArgsConstructor를 정의하면 된다.

@Getter
@NoArgsConstructor
public class TestVO {

	private String name;
    
	@Setter
	private int age;

	@Builder
	public TestVO(String name) {
		this.name = name;
	}
}

 

728x90

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

AutoBoxing과 AutoUnBoxing  (0) 2021.08.25
@Async, CompletableFuture, parallelStream  (0) 2021.07.14
Collections.EMPTY_LIST, Collections.EMPTY_MAP  (0) 2021.07.12
Map에 stream 사용하기  (0) 2021.06.18
ThreadLocal  (0) 2021.03.16