@Builder
π @Builder λ?
Lombok
μ @Builder
λ λΉλ ν¨ν΄μ μλμΌλ‘ μμ±νλ μ΄λ
Έν
μ΄μ
μ΄λ€.
1
2
3
4
5
6
7
8
@Getter
@Builder
public class User {
private String name;
private String email;
private int age;
private String address;
}
1
2
3
4
5
6
User user = User.builder()
.name("κΉμ² μ")
.email("kim@example.com")
.age(30)
.address("μμΈμ κ°λ¨κ΅¬")
.build();
@Builder
λ₯Ό ν΄λμ€μ λΆμ΄λ©΄ Lombokμ΄ μ»΄νμΌ μμ μ λΉλ ν΄λμ€μ λ©μλλ₯Ό μμ±νλ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
private User(String name, String email, int age, String address) {
this.name = name;
this.email = email;
this.age = age;
this.address = address;
}
public static UserBuilder builder() {
return new UserBuilder();
}
public static class UserBuilder {
private String name;
private String email;
private int age;
private String address;
public UserBuilder name(String name) {
this.name = name;
return this;
}
public UserBuilder email(String email) {
this.email = email;
return this;
}
public UserBuilder age(int age) {
this.age = age;
return this;
}
public UserBuilder address(String address) {
this.address = address;
return this;
}
public User build() {
return new User(name, email, age, address);
}
}
Lombokμ΄ μλμΌλ‘ μμ±νλ μ½λλ μΈ κ°μ§μ΄λ€.
- μ 체 νλλ₯Ό μΈμλ‘ λ°λ
private
μμ±μ - λΉλ κ°μ²΄λ₯Ό 리ν΄νλ λ©μλ
- λ΄λΆ λΉλ ν΄λμ€
νλμ λͺ¨λ setter
λ©μλλ return this;
λ₯Ό ν¬ν¨νκΈ°μ λ©μλ 체μ΄λμ΄ κ°λ₯νλ€.
π μ₯μ
- μμ±μλ‘ κ°μ²΄λ₯Ό μμ±νλ λ°©λ²λ³΄λ€ κ°λ μ±μ΄ μ’λ€.
- λ©μλ 체μ΄λμ ν΅ν΄ νμν νλλ§ μ ννμ¬ κ°μ²΄λ₯Ό μ μ°νκ² μμ±ν μ μλ€.
- λ§€κ°λ³μ μμλ₯Ό μ κ²½μ°μ§ μμλ λλ€.
setter
λ©μλ μμ΄ λΆλ³ κ°μ²΄λ₯Ό μμ±ν μ μλ€.
π λ¨μ
- νμλ‘ νμν νλλ₯Ό λλ½ν κ°λ₯μ±μ΄ μλ€.
- κ°μ²΄ μμ±μ μ¬λ¬ λ©μλλ₯Ό νΈμΆνλ―λ‘ μ±λ₯ μ μ€λ²ν€λκ° λ°μνλ€.
π @Builder κ΄λ ¨ μ΅μ
@Builder.Default
@Builder.Default
λ @Builder
λ₯Ό μ¬μ©ν λ νΉμ νλμ κΈ°λ³Έκ°μ μ€μ νκΈ° μν μ΅μ
μ΄λ€.
1
2
3
4
5
6
7
8
9
@Builder
public class User {
private String name;
private int age = 20;
}
User user = User.builder()
.name("νκΈΈλ")
.build();
λΉλλ νλμ μ΄κΈ°ν κ°μ 무μνκ³ , μ€μ λμ§ μλ νλμλ null
μ ν λΉνλ€. μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν λ°©λ²μ μ΄κΈ° κ°μ΄ μ€μ λ νλ μμ @Builder.Default
λ₯Ό λͺ
μνλ κ²μ΄λ€. μ΄λ₯Ό ν΅ν΄ λΉλκ° μ€μ λμ§ μμλ κΈ°λ³Έ κ°μ μ λλ‘ ν λΉν μ μλ€.
toBuilder
toBuilder
μ΅μ
μ κΈ°μ‘΄ κ°μ²΄μ νλ κ°μ 볡μ¬νμ¬ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±ν λ μ¬μ©νλ€. λΆλ³ κ°μ²΄μ μΌλΆ κ°λ§ λ³κ²½ν΄μΌ ν λ μ μ©νλ€.
toBuilder
μ΅μ
μ΄ νμ±νλλ©΄ Lombokμ μ»΄νμΌ μμ μ toBuilder
λ©μλλ₯Ό μμ±νλ€. μ΄ λ©μλλ κΈ°μ‘΄ κ°μ²΄μ νλ κ°μΌλ‘ μ΄κΈ°νλ λΉλλ₯Ό 리ν΄νλ€.
1
2
3
4
5
6
7
8
9
Order firstOrder= Order.builder()
.orderNumber("12345")
.productName("λ
ΈνΈλΆ")
.totalPrice(1500000L)
.build();
Order secondOrder= firstOrder.toBuilder()
.totalPrice(1450000L)
.build();
λ¨, toBuilder
λ©μλλ κΈ°μ‘΄ κ°μ²΄λ₯Ό μμ νλ κ²μ΄ μλ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±νλ κ²μ΄λ―λ‘ μ΄λ₯Ό save
νκ² λλ©΄ μλμ λ€λ₯Έ λμμ΄ λ°μν μ μλ€. μ μμ μμ secondOrder
λ firstOrder
μ λ³κ°μ μΈμ€ν΄μ€μ΄λ€. save(secondOrder)
λ₯Ό νΈμΆνλ©΄ JPAλ INSERT
쿼리λ₯Ό μ€ννμ¬ μλ‘μ΄ λ μ½λκ° μΆκ°λλ€.
JPA μν°ν°λ₯Ό μ¬λ°λ₯΄κ² μμ νκΈ° μν λ°©λ²μ toBuilder
λ©μλλ₯Ό μ¬μ©νλ κ²μ΄ μλλΌ μμ μν μν°ν°λ₯Ό setter
λ λ©μλλ₯Ό ν΅ν΄ κ°μ λ³κ²½ν΄μΌ νλ€.
@SuperBuilder
@SuperBuilder
λ μμ κ΄κ³μ μλ ν΄λμ€μμ λΉλλ₯Ό μ¬λ°λ₯΄κ² μ¬μ©ν μ μλλ‘ νλ μ΄λ
Έν
μ΄μ
μ΄λ€.
1
2
3
4
5
6
7
8
9
@Builder
public class Parent {
private String parentName;
}
@Builder
public class Child extends Parent {
private String childName;
}
μμ κ΄κ³μ μλ ν΄λμ€μ @Builder
λ₯Ό μ¬μ©νλ©΄ μ»΄νμΌ μλ¬κ° λ°μνκ² λλ€. μμ ν΄λμ€λ λΆλͺ¨ ν΄λμ€μ μ μ λ©€λ²λ₯Ό μμλ°μΌλ©°, λ°λΌμ μμ ν΄λμ€μλ μμμ builder
λ©μλμ λΆλͺ¨μ builder
λ©μλκ° λμμ μ‘΄μ¬νκ² λλ€. μλ°λ μ μ λ©μλμ μ€λ²λΌμ΄λ©μ νμ©νμ§ μμΌλ©°, μμμ λ©μλκ° λΆλͺ¨μ λ©μλλ₯Ό μ¨κΉ μ²λ¦¬νλ€. κ·Έλ¬λ @Builder
λ κ° ν΄λμ€μ λν΄ μλ‘ κ΄λ ¨ μλ λ΄λΆ λΉλ ν΄λμ€λ₯Ό μμ±νλ€. λ°λΌμ μμ ν΄λμ€λ μ΄λ¦μ κ°μΌλ μλ‘ νΈνλμ§ μλ λ¦¬ν΄ νμ
μ κ°μ§ λ κ°μ builder
λ©μλλ₯Ό κ°μ§κ² λμ΄ μ»΄νμΌ μλ¬κ° λ°μνλ€.
@SuperBuilder
λ₯Ό μ¬μ©νλ©΄ μμ ν΄λμ€μ λΉλμμ λΆλͺ¨ ν΄λμ€ νλκΉμ§ μ€μ ν μ μκ² λλ€. κ·Έ μ΄μ λ @Builder
μ λ¬λ¦¬ μμ κ΄κ³λ₯Ό μ§μνκΈ° μν΄ μ λ€λ¦μ μ¬μ©ν λΉλ ν΄λμ€ κ³μΈ΅μ μ¬μ©νκΈ° λλ¬Έμ΄λ€. μ¦, λ΄λΆμ μΌλ‘ μμ λΉλκ° λΆλͺ¨ λΉλλ₯Ό μμλ°λ ꡬ쑰λ₯Ό λ§λ λ€.