[개발일지] 230511 @JsonAutoDetect을 이용해 직렬화, 역직렬화

기존 getter 메서드와 생성자로 이루어진 dto 클래스를 record 클래스로 리팩터링 하는데 record클래스가 자동으로 생성해주는 getter 메서드를 인식하지 못해 직렬화가 안되는 문제 발생 → @JsonAutoDetect 어노테이션을 이용해서 필드에 선언된 값들을 직렬화, 역직렬화 하도록 설정해서 해결

 

오늘 새로 배운 내용

@JsonAutoDetect

@JsonAutoDetect이란 Jackson 라이브러리에서 제공하는 어노테이션 중 하나로 Jackson이 객체를 JSON으로 직렬화하거나 JSON을 객체로 역직렬화할 때 어떤 필드를 인식할지 결정할 수 있다.

나의 경우 @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)로 설정해줘서 public 또는 private로 선언된 모든 필드가 직렬화, 역직렬화의 대상이 되도록 해주었다.

즉, getter 메서드가 없어도 자동으로 직렬화, 역직렬화를 해준다.

 

getter메서드를 사용하는것과 @JsonAutoDetect를 사용하는것의 차이점

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)으로 설정을 한다면 해당 클래스 내의 모든 필드가 직렬화, 역직렬화 대상이 된다는것을 의미하는것이지만, getter를 이용한다면 getter메서드가 있는 필드만 직렬화, 역직렬화 대상이 되는것이기 때문에 getter메서드를 이용하면 어떤 필드를 직렬화, 역직렬화 할것인지 명시적으로 나타낼 수 있다는 장점이 있다.

 

Visibility에는 ANY값 외에도 enum 클래스로 정의된게 있다.

 

 

ANY : 어떠한 제약 없이 모든 필드를 인식한다.

NON_PRIVATE : private 필드를 제외한 모든 필드를 인식한다. public 및 protected 필드는 기본적으로 인식된다.

PROTECTED_AND_PUBLIC : public과 protected 필드를 인식한다. private 필드는 인식되지 않다.

PUBLIC_ONLY : 오직 public 필드만 인식한다.

NONE(default) : 모든 필드를 인식하지 않고, 명시적으로 설정된 어노테이션이나 가시성 설정에 따라 필드가 선택된다.

 

어떤 값을 설정할지는 각자의 상황에 맞게 설정해주면 될 것 같다.

 

결론

@JsonAutoDetect 어노테이션과 getter 메서드 중 어떤것을 사용하는게 좋은지에 대한 개인적인 생각으로는 getter를 이용해 어떤 필드를 직렬화, 역직렬화 할것인지 명시해주는게 좋은것 같지만 나의 경우 record 클래스가 자동으로 생성해주는 getter 메서드를 인식하지 못해 어쩔 수 없이 @JsonAutoDetect 어노테이션을 사용했다.