@Builder를 클래스에 사용시 NULL 오류(NPE) 주의

DongHyun Kim·2023년 5월 2일
0

백엔드

목록 보기
13/16

발생한 문제 ❗
Team 클래스에 members 리스트를 필드에서 초기화했는데 Team 객체 생성시 Null을 반환하는 문제

문제 원인

@Entity
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Team {

    @Id @GeneratedValue
    private Long id;
    private String name;

    @OneToMany(mappedBy = "team")
    private List<Member> members = new ArrayList<>();
}

위와 같이 Team 클래스를 정의한 뒤
Team team = new Team().builder().id(1).name("anak").build();
빌드 패턴을 이용해서 id와 name을 초기화한 뒤 객체를 생성했다. 하지만 team 에서 members에 접근할 때 NPE 오류가 발생했다!!

이건 @Builder 를 Class에 붙였을 때 발생할 수 있는 문제로, build() 과정에서 포함되지 않은 필드들은 모두 Null 또는 0이 된다고 공식 문서에 적혀있었다

@Builder.Default
If a certain field/parameter is never set during a build session, then it always gets 0 / null / false. If you've put @Builder on a class (and not a method or constructor) you can instead specify the default directly on the field, and annotate the field with @Builder.Default:
@Builder.Default private final long created = System.currentTimeMillis();

해결 방법

@Entity
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Team {

    @Id @GeneratedValue
    private Long id;
    private String name;

	// builder() 에서 초기화하지 않는 필드는
    // Default 를 붙여주자!
    @Builder.Default
    @OneToMany(mappedBy = "team")
    private List<Member> members = new ArrayList<>();
}
profile
do programming yourself

0개의 댓글