[Spring boot] Jackson 직렬화 boolean 필드 is 접두사 생략 문제

ichubtou·2024년 9월 23일
0

사이드 프로젝트를 하다가 Spring에서 Jackson으로 직렬화를 할때 boolean 타입의 필드에 대해서 is가 생략되는 현상을 겪게되었다.

문제 확인

PageInfo 클래스에서 Lombok의 @Getter를 사용했는데 예상과는 다른 결과가 나왔다.
직렬화된 JSON에서 필드명이 isFirstisLast가 아닌 firstlast로 출력되는 문제가 발생되는 것이었다.



원인

해당 문제에 대해서 찾아보니 Lombok의 @Getter와 Jackson의 직렬화 방식 간의 상호작용 때문이라는 것을 알게 되었다.

본래 Getter Setter 어노테이션은 사용하면 각 필드에 get, set이 붙어서 메서드가 생성되는데 JavaBean 규약에 따르면 boolean 에 한정하여 is 가 앞에 붙는 것이었다.

getIsFirst가 아닌 isFirst 으로 메서드가 생성되는 것이었다.

롬복 공식문서

위의 롬복 공식문서에서 해당 내용을 확인할 수 있었다.

위와 같이 isFirst() isLast() 로 생성 되었다

Lombok에서 생성된 메서드를 확인하는 방법은 단축키 cmd + 7 (alt + 7)를 이용해서 Structure 탭을 열어서 확인한다.



해결법

1. 실패

@JsonProperty 사용
해결하기 위해서 @JsonProperty를 붙여보았는데 더 이상한 현상이 발생되었다.

위와 같은 현상이 발생되는 이유를 찾아보니 jackson은 직렬화 과정에서 getter/setter를 사용하는 데 이미 `@Getter`로 인해 `isFirst()`가 생성되어 있어 `first` 값을 만들어주고 @JsonProperty로 인해 `isFirst` 값을 만들어주게 되는 것이다. 상단의 `@getter`를 제거하면 원하는 결과를 얻을 수 있지만 `getter` 메서드를 모두 작성해야한다.

1. Boolean 사용(Wrapper class)

이 문제를 해결하기 위해 boolean 대신 Wrapper 클래스를 사용하는 방법이 있는데
Lombok은 원시 타입인 boolean 필드에 is 접두사를 붙인 getter를 생성하지만 Boolean 같은 Wrapper 클래스에 대해서는 일반적인 get 메서드를 생성하므로 해결할 수 있다.



결론

Spring에서 Jackson을 사용하여 boolean 필드를 직렬화할 때 예상하지 못한 필드명이 출력되는 문제는 Lombok의 @Getter와 Jackson의 직렬화 방식 간의 상호작용으로 인해 발생했다. 이를 해결하기 위한 방법에는 @JsonProperty와 같은 방법과 boolean 대신 Boolean을 사용하는 것이다. (+ is 접두사가 붙은 변수명 사용X)

0개의 댓글