Builder ν¨ν΄
μ λ°μ΄νΈ:
π λͺ¨λ μμ€λ Githubμ μμ΅λλ€.
Effective Javaμμ λ°°μ λ Build ν¨ν΄μ μ 리ν ν¬μ€νΈ μ λλ€.
Builder ν¨ν΄μ΄λ?
κ°μ²΄λ₯Ό μμ±νκΈ° μν΄ λ€μμ Parameterκ° νμν λ Setterλ₯Ό μ°λ κ² λ§κ³ λ©μλ 체μ΄λ λ°©μμΌλ‘ κ°μ²΄λ₯Ό μμ±νλ λ°©μμ λ§ν©λλ€.
π‘λ©μλ 체μ΄λμ΄λ? μ¬λ¬ λ©μλλ₯Ό μ΄μ΄μ νΈμΆνλ λ°©μμ λ§νλ©°, λ©μλ λ§λ€
this
λ₯Ό λ°ννμ¬ μμ°¨μ μΌλ‘ νΈμΆνλ κ²μ λλ€.
λ€μν λͺ©μ μ΄ μκ² μ§λ§ κ°μ²΄λ₯Ό μμ± μ Setterμ λ¬λ¦¬ λΆλ³ κ°μ²΄λ₯Ό μμ±νκΈ° μν΄ μ¬μ©ν©λλ€.
π‘λΆλ³κ°μ²΄λ? κ°μ²΄ μμ± μ΄ν λ΄λΆμ μνκ° λ³νμ§ μλ κ°μ²΄λ‘ μμΈν λ΄μ©μ λ€λ₯Έ ν¬μ€ν μ μ¬λ¦¬κ² μ΅λλ€~
μ§μ μμ±ν Builder μ½λ
Post (μλ κ°μ²΄)
λ€μμ Post κ°μ²΄ μ λλ€.
public class Post {
@Id
private Long id;
@Column(length = 255, nullable = false)
private String title;
@Column(nullable = false)
private String content;
private String author;
// (1)
public static PostBuilder builder(String title, String content) {
return new PostBuilder(title, content);
}
}
(1) PostBuilder
λ₯Ό μμ±νκΈ° μν λ©μλ builder()
λ₯Ό μμ±νμ΅λλ€.
builder()
λ©μλλ static
μΌλ‘ μ μΈνκ³ , νμλ‘ μΈν
ν νλλ₯Ό μΈμλ‘ νμ¬ λ©μλλ₯Ό μμ±ν©λλ€.
Builder ν΄λμ€
κ°μ²΄ μμ Inner Classλ‘ Builder ν΄λμ€λ₯Ό μ μΈν©λλ€.
Inner Classλ λ€μκ³Ό κ°μ΄ μκ²Όμ΅λλ€.
// (1)
public static class PostBuilder {
// (2)
private String title;
private String content;
private String author;
// (3)
public PostBuilder(String title, String content) {
this.title = title;
this.content = content;
}
// (4)
public PostBuilder author(String author) {
this.author = author;
return this;
}
// (5)
public Post build() {
return new Post(this.title, this.content, this.author);
}
}
(1) Builder ν΄λμ€λ static
μΌλ‘ μ μΈν©λλ€.
(2) Inner Classμ λ©€λ² νλλ μλ κ°μ²΄, μ¦, Post
μ λμΌνκ² μμ±ν©λλ€.
π‘κΌ λμΌν νμλ μμ΅λλ€.
Post
κ°μ²΄λ₯Ό Builderλ‘ μμ± μ νμν νλλ§ μ μΌλ©΄ λμ§λ§ λλΆλΆ λͺ¨λ νλλ₯Ό κΈ°μ¬ν©λλ€.
(3) νμλ‘ μΈν
ν νλλ₯Ό μΈμλ‘ νλ PostBuilder
μμ±μλ₯Ό λ§λλλ€.
(4) μΆκ°λ‘ μΈν
ν νλ λ©μλ, author()
λ₯Ό μμ±ν©λλ€.
μ¬κΈ°μ λ©μλ 체μ΄λμ΄ μΌμ΄λ©λλ€.
(5) κ°μ²΄, Post
λ₯Ό λ°νν build()
λ©μλλ₯Ό μμ±ν©λλ€.
μ¬μ©λ²
μμ μ½λλ₯Ό 보면 μ§μμ΄ κ°μκ² μ§λ§ Buliderλ₯Ό μμ± μ νμ κ°μ λκΈ°κ³ , λ©μλ 체μ΄λ λ°©μμΌλ‘ author
λ₯Ό μΈν
ν©λλ€.
PostBuilder builder = Post.builder("title", "content");
builder.author("author");
Post build = builder.build();
Builderλ₯Ό μ§μ μμ±νλ λ°©λ²μ λν΄μ μμλ΄€μ΅λλ€.
νμ§λ§ μ°λ¦¬λ κ°bok, Lombok
μ μ¬μ©νλ©΄ Builder ν¨ν΄μ μ’ λ μ½κ² μ΄μ©ν μ μμ΅λλ€.
π‘κ·Έλλ Builder ν¨ν΄μ μ§μ νλ² μ§λ³΄μλκ±Έ μΆμ²λ립λλ€. Builderκ° μ΄λ€ μμΌλ‘ λμνλμ§λ₯Ό μλ©΄ λμμ΄ λ§μ΄ λμ€κ²λλ€~
Lombokμ μ¬μ©ν Builder
μ°μ @Builder
μ΄λ
Έν
μ΄μ
μ λ΄λΆλ₯Ό νλ² λ³΄κ² μ΅λλ€.
@Target({TYPE, METHOD, CONSTRUCTOR})
@Retention(SOURCE)
public @interface Builder {
@Target(FIELD)
@Retention(SOURCE)
public @interface Default {}
String builderMethodName() default "builder";
String buildMethodName() default "build";
String builderClassName() default "";
boolean toBuilder() default false;
AccessLevel access() default lombok.AccessLevel.PUBLIC;
....
}
@Builder
μ΄λ
Έν
μ΄μ
μ ν΄λμ€, μΈν°νμ΄μ€, enumκ³Ό λ©μλ, μμ±μμ μ μΈν μ μμ΅λλ€.
ν΄λμ€μ μ μΈν κ²½μ° λͺ¨λ νλλ₯Ό λ©μλ 체μ΄λμΌλ‘ νλ μ°κ²°νλ Builderκ° λ§λ€μ΄μ§λλ€.
λ©μλμ μ μΈν κ²½μ° λ©μλμ μΈμκ°λ§ λ©μλ 체μ΄λμΌλ‘ μ°κ²°ν μ μμ΅λλ€.
// ν΄λμ€μ @Builder μ μΈ
@Builder
public class Post {
@Id
private Long id;
@Column(length = 255, nullable = false)
private String title;
@Column(nullable = false)
private String content;
private String author;
}
// μ¬μ©
public void lombokBuilderPattern() {
Post post = Post.builder()
.id(1L)
.title("title")
.content("content")
.author("author")
.build();
}
// λ©μλμ @Builder μ μΈ
@Builder
public Post(String title, String content) {
this.title = title;
this.content = content;
}
// μ¬μ©
public void lombokBuilderPattern() {
Post post = Post.builder()
.title("title")
.content("conent")
.build();
}
@Builderμ μ¬λ¬ μμ±λ€
@Builder
μ΄λ
Έν
μ΄μ
μλ μ¬λ¬κ°μ§ μμ± λ€μ΄ μλλ° νλ μ© λ³΄λλ‘ νκ² μ΅λλ€.
-
@Default
λΌλ μ΄λ Έν μ΄μ μ΄ νλ λ μλλ°, μ΄λ Builder μ¬μ© μ μ΄κΈ°ννμ§ μμΌλ©΄, λ³μμ κΈ°λ³Έ κ°μ μ§μ ν©λλ€. λ€μκ³Ό κ°μ΄ μ μΈνλ©΄ βdefault authorβκ° λ€μ΄κ°λ κ²μ νμΈν μ μμ΅λλ€.@Builder.Default private String author = "default author"; // μ¬μ© Post post = Post.builder() .title("title") .content("conent") .build();
-
builderMethodName
μbuilderClassName
μ ν ν΄λμ€ μμμ@Builder
λ₯Ό 2κ° μ΄μμ μμ±μμμ μ¬μ©ν λ κ°μ΄ μ¬μ©ν©λλ€.π‘νΉν μμ±μμ μΈμκ°κ³Ό λμΌνκ² λ©μλ 체μ΄λμ νκ³ μ νλ€λ©΄
builderMethodName
μbuilderClassName
λ κ°λ₯Ό ν¨κ» μ¬μ©ν΄μΌ ν©λλ€.@Builder(builderClassName = "PostTitleBuilder", builderMethodName = "postTitleBuilder") public Post(String title) { this.title = title; } @Builder(builderClassName = "PostTitleAndContentBuilder", builderMethodName = "postTitleAndContentBuilder") public Post(String title, String content) { this.title = title; this.content = content; }
Post post1 = Post.postTitleBuilder() .title("title") .build(); Post post2 = Post.postTitleAndContentBuilder() .title("title") .content("content") .build();
λ§μ½ μμμ
builderClassName
λ₯Ό μλ΅νκ³builderMethodName
λ§ μ¬μ©νλ€λ©΄postTitleBuilder()
λ©μλλ₯Ό μ¬μ©ν λλ,content()
κ° μ¬μ© κ°λ₯ν κ²μ νμΈν μ μμ΅λλ€. -
toBuilder
λ builderλ₯Ό μ΄μ©νμ¬ μμ±λ κ°μ²΄μμ νΉμ κ°λ§ λ³κ²½νμ¬ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±νκ³ μ ν λ μ¬μ©ν©λλ€. μμ±μ κ°μtrue/false
μ λλ€.PostBuilder postBuilder = post1.toBuilder(); Post update_title = postBuilder.title("update title") .build();
κΈ°μ‘΄
post1
μμtitle
μ μ λ°μ΄νΈ νκ³ μ ν λ,toBuilder()
λ‘ Builderλ₯Ό μμ±νκ³title
μ μλ‘ μΈν ν©λλ€.βκ·Έλ°λ°, μ΄λ°μμΌλ‘ κ°μ²΄μ μνλ₯Ό μ λ°μ΄νΈ ν κΊΌλΌλ©΄ Setterλ₯Ό μ°λκ² λ«μ§ μμκΉ μΆλ€μ. (νΉμ κ°μ²΄μ μνλ₯Ό λ³κ²½νλ λ©μλλ₯Ό λ°λ‘ λ§λ€κ±°λ) Builderλ₯Ό μμ±νκΈ° μν΄ λΆνμν λΉμ©κ³Ό μ½λλΌμΈμ΄ μΆκ°λκΈ° λλ¬Έμ λΆνμνλ€ μκ°νκ³ λ³λ‘ μ¬μ©λ μΌμ΄ μμ΄λ³΄μ λλ€.
-
access
λ Builder ν΄λμ€μ μ κ·Όμ νμλ₯Ό μ€μ νλ€.AccessLevel
μ enumμ μ¬μ©ν©λλ€.
π‘builderμμ requiredμ optionalμ μ€μ νκΈ° μν μ½λ μμ± λ°©λ²μ λ€μκ³Ό κ°μ΄ μ¬μ©νλ©΄ λ©λλ€.
@Builder(builderMethodName = "allBuilder")
public class Post {
public static PostBuilder builder(String title, String content) {
return allBuilder()
.title(title)
.content(content);
}
}
λ§λ¬΄λ¦¬
μ΄λ² ν¬μ€νΈμμ Builder ν¨ν΄μ λν΄ μμλ΄€μ΅λλ€. Builder ν¨ν΄μ 무λΆλ³ν Setterλ₯Ό μ§μνκ³ , λΆλ³ κ°μ²΄λ₯Ό μ μ§νκΈ° μν΄ μ£Όλ‘ μ¬μ©ν©λλ€.
νμ§λ§, Builder ν¨ν΄μ μ μ©ν μμ±μμ μΈμκ°μ΄ 1κ°, νΉμ 2κ° λ± κ°―μκ° μ λ€λ©΄ μ€νλ € μμ’μ μν©μ΄ λμ¬μ μμ΅λλ€.
λ°λΌμ Builder ν¨ν΄μ μΈμκ° 4κ°, μ μ΄λ 3κ° μ΄μλμμλ μ¬μ©νλ κ²μ κΆμ₯ν©λλ€.
2022λ μν΄κ° λ°μμ΅λλ€~ μν΄μ λ€λ€ μνλ κ²μ μ΄λ£¨μκ³ , 무μλ³΄λ€ κ±΄κ°νμκΈΈ λ°λλλ€.
μ΄λ²μλ μ ν¬μ€νΈλ₯Ό μ½μ΄μ£Όμ λΆλ€ κ°μ¬ν©λλ€. π
λκΈλ¨κΈ°κΈ°