롬복 @Builder 사용시 자바 컬렉션에 null이 세팅되는 경우

nawhew·2021년 9월 28일
0
post-thumbnail

빌더 어노테이션 사용시 null 발생

DTO를 받아 Builder를 통해 Entity로 변환하는 과정에서 컬렉션들이 null로 세팅되는 것을 발견하였다.

대부분의 경우 컬렉션에 명시적초기화와 함께 final을 붙여주었지만, 이번엔 그렇지 않은 경우였다.

  • 테스트 객체
@Builder ...
public class TestEntity {
	private Set<Account> testers = new HashSet<>();
  • 아래코드에서 Set인 testers가 null로 세팅되어 있어 2번째줄에서 NullPointException 발생
TestEntity test = TestEntity.builder().build();
test.testers.add(account1);

null이 세팅되는 이유

이유는 아래와 같다.

Lombok @Builder not initializing collections

  • 롬복 개발자의 답변

    Only when you use @Singular, you get an empty list. On the Builder documentation page it says:

    …with the @Singular annotation, lombok will treat that builder node as a collection.

    Without the @Singular, lombok treats it as any other object. So it will be null instead of an empty Collection.

해결법

이런 경우엔

  • 컬렉션에 final을 붙여준다. (아래 테스트 2)
  • 컬렉션에 @Builder.default 어노테이션을 붙여준다. (아래 테스트 3, 4)
  • Builder 사용시 컬렉션에 값을 넣어 준다.
    TestEntity test = TestEntity.builder().testers(new HashSet<>()).build();

테스트

@Builder ...
public class TestEntity {
...
  // 1 : null
  private Set<Account> tester1 = new HashSet<>();

  // 2 : 초기화 o
  private final Set<Account> tester2 = new HashSet<>();

  // 3 : 초기화 o
  @Builder.Default
  private Set<Account> tester3 = new HashSet<>();

  // 4 : 초기화 o
  @Builder.Default
  private final Set<Account> tester4 = new HashSet<>();

  // 5 : 오류 발생 @Builder.Default를 쓰기 위해서는 반드시 초기화 할 기본 값을 주어야한다.
  @Builder.Default
  private final Set<Account> tester4;

참고자료

Stackoverflow : Lombok @Builder not initializing collections
Lombok Docs : @Builder

profile
개인 기술 블로그 - 개념정리/프로젝트/테스트/오류/짧은지식

0개의 댓글