π νμ¬ μν© λ° λ°°κ²½ μ€λͺ
νμ¬ νλ‘μ νΈμμ Builder ν¨ν΄μ μ¬μ©νμ¬ μν°ν° κ°μ²΄λ₯Ό μμ±νκ³ μμΌλ©°, νΉν μλ°©ν₯ μ°κ΄κ΄κ³λ₯Ό μ€μ ν Organization μν°ν°μμ 리μ€νΈ ννμ 컬λ μ νλλ₯Ό μ¬μ©νκ³ μλ€.
⢠ꡬν μ½λ
@Entity
@Getter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class Organization {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
...
// μλ°©ν₯ μ°κ΄κ΄κ³
@OneToMany(mappedBy = "organization", cascade = CascadeType.REMOVE, orphanRemoval = true)
private List<OrganizationMember> organizationMembers = new ArrayList<>();
// μ°κ΄κ΄κ³ νΈμ λ©μλ - μΆκ°
public void addOrganizationMember(OrganizationMember organizationMember) {
this.organizationMembers.add(organizationMember);
}
// μ°κ΄κ΄κ³ νΈμ λ©μλ - μμ
public void removeOrganizationMember(OrganizationMember organizationMember) {
this.organizationMembers.remove(organizationMember);
}
}
π¨ λ¬Έμ μν©
μλ°©ν₯ μ°κ΄κ΄κ³λ₯Ό μ€μ νλ©΄μ organizationMembers 리μ€νΈλ₯Ό new ArrayList<>()λ‘ μ΄κΈ°ννμμλ λΆκ΅¬νκ³ NullPointerExceptionμ΄ λ°μνλ λ¬Έμ κ° μμλ€.
βοΈ μμΈ λΆμ
Builder ν¨ν΄μ μ¬μ©ν λ, 리μ€νΈλ 컬λ μ κ³Ό κ°μ νλλ κΈ°λ³Έμ μΌλ‘ μ΄κΈ°νλμ§ μλλ€. μ΄λ‘ μΈν΄ 컬λ μ νλκ° null μνλ‘ μ μ§λμ΄ μ°κ΄κ΄κ³ νΈμ λ©μλμμ add() νΈμΆ μ μλ¬κ° λ°μν κ²μ΄λ€.
π¨ ν΄κ²° λ°©λ²
Builderλ₯Ό μ¬μ©νλ©΄μ μ΄κΈ°νκ° νμν νλμλ @Builder.Defaultλ₯Ό μ¬μ©νμ¬ κΈ°λ³Έκ°μ λͺ μμ μΌλ‘ μ€μ ν΄ μ£Όμ΄μΌ νλ€.
@Entity
@Getter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class Organization {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
...
// μλ°©ν₯ μ°κ΄κ΄κ³
@Builder.Default // 리μ€νΈ κΈ°λ³Έκ° μ΄κΈ°ν
@OneToMany(mappedBy = "organization", cascade = CascadeType.REMOVE, orphanRemoval = true)
private List<OrganizationMember> organizationMembers = new ArrayList<>();
// μ°κ΄κ΄κ³ νΈμ λ©μλ - μΆκ°
public void addOrganizationMember(OrganizationMember organizationMember) {
this.organizationMembers.add(organizationMember);
}
// μ°κ΄κ΄κ³ νΈμ λ©μλ - μμ
public void removeOrganizationMember(OrganizationMember organizationMember) {
this.organizationMembers.remove(organizationMember);
}
}
π κ²°κ³Ό κ΄μ°°
λ¬Έμ κ° ν΄κ²°λμμΌλ©°, 컬λ μ νλκ° μ μμ μΌλ‘ μ΄κΈ°νλμ΄ NullPointerException μμ΄ λ¦¬μ€νΈμ λ°μ΄ν°λ₯Ό μΆκ°νκ±°λ μμ ν μ μκ² λμλ€.
![](https://blog.kakaocdn.net/dn/QpeX3/btsKesSEuo4/qo42cQF6g71hEroOZAr5E1/img.png)
π‘ κ³ μ°°
Builder ν¨ν΄μ κ°λ μ±κ³Ό μ μ°μ±μ μ 곡νμ§λ§, 컬λ μ κ³Ό κ°μ νλλ μλμΌλ‘ μ΄κΈ°νλμ§ μλλ€λ μ μ μ£Όμν΄μΌ νλ€. @Builder.Defaultλ₯Ό μ μ ν μ¬μ©ν¨μΌλ‘μ¨ μ΄λ¬ν λ¬Έμ λ₯Ό λ°©μ§ν μ μλ€. μ΄λ² λ¬Έμ λ₯Ό ν΅ν΄ κ°λ° λꡬμ λμ λ°©μμ μΆ©λΆν μ΄ν΄νκ³ μ¬μ©νλ κ²μ΄ μ€μνλ€λ μ μ λ€μ νλ² λκΌλ€. μμΌλ‘λ νΈλ¦¬ν κΈ°λ₯λ€μ μ¬μ©ν λ κ·Έ λ΄λΆ λμμ λͺ νν μ΄ν΄νλ μ΅κ΄μ κΈ°λ₯΄λ €κ³ νλ€.