본문 바로가기

트러블슈팅

[lombok] @Builder.Default 사용 시 기본 생성자

이슈 설명

@Builder.Default를 사용하려고 찾다보면 기본 생성자와 관련된 이슈가 있는 것을 쉽게 알 수 있습니다.

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
class Foo {
    @Builder.Default
    private String bar = "bar";
}

위와 같은 코드가 있을 때 builder를 통해서는 bar의 기본값이 정상 설정되지만 기본 생성자에서를 통해서는 값이 설정되지 않고 null이 된다는 것입니다.

이슈가 해결된 것으로 착각하게 된 과정

Spring Boot 2.7.4 dependency를 통해 lombok 1.18.24 버전을 사용하고 있었는데

프로젝트에서 테스트 코드를 만들어 확인 시에도 문제가 발생하지 않았습니다.

(참고로 글 작성 시점(2023.04.09) 최신 Lombok 버전은 1.18.26입니다.)

 

그리고.. lombok changelog에는 1.18.24 버전에서 관련 이슈 하나가 해결된 것처럼 적혀 있습니다..!

분명히 이슈가 있는 것으로 알고 있었는데 현재 잘 동작하고

changelog에도 관련 이슈가 해결된 것처럼 적혀 있으니(사실 정확히 읽어보면 delomboking 이슈이고 결이 다릅니다..!)

문제 없는 것으로 생각하고 사용을 하였고 PR에도 자신있게 이슈 없다고 적었습니다..!

이슈의 실체

이게 제가 관련 이슈를 얇게 알고 있어 착각한 것이었습니다.

 

PR 과정에서 이야기가 오가면서 추가적으로 테스트를 해보게 되었는데 아래 2가지 경우 중 2번 케이스에 문제가 여전히 존재했습니다.

 

  1. lombok의 @NoArgsConstructor를 사용한 경우
  2. 개발자가 명시적으로 기본 생성자를 적어준 경우

2번 케이스는 아래와 같은 코드입니다.

@Getter
@Builder
public class Foo {
    public Foo(){}
    
    @Builder.Default
    private String bar = "bar";
}

그럼에도

저희 팀은 @Builder.Default를 사용하기로 했는데요. 이유는 아래 2가지 입니다.

 

  1. 개발자가 NoArgsConstructor를 사용하지 않고 기본 생성자를 직접 명시하는 경우가 었었다.
  2. @Builder.Default만큼 builder에 쉽고 명시적으로 기본값을 설정할 수 있는 방법이 마땅치 않다.

다른 분들은 저와 같은 착각을 하지 않기를..

@Builder.Default는 기본 생성자와 함께 사용하면 예상하지 못한 동작이 있으니 정확히 알고 쓰시기를 바랍니다!