객체를 정의하고 그 객체를 생성할 떄 보통 생성자를 통해 생성하는 것을 생각한다.
생성자를 통해 객체를 생성 할 때의 단점
객체를 생성할 수 있는 빌더를 builder() 함수를 통해 얻고 거기에 셋팅하고자 하는 값을 셋팅하고 마지막에 build()를 통해 빌더를 작동시켜 객체를 생성한다.
public User toEntity(){
return User.builder()
.userId(id)
.name(name)
.password(password)
.roles(role)
.build();
}
빌더 사용 이유
User user = new User("name", 20, "ISFJ","milk","todo",1000);
생성자 파라미터로 받는 값들이 많아지면 각 값들이 어떤 값을 의미하는지 파악하기 어렵다. 하지만 빌더 패턴을 통해 작성하면 각 값들은 빌더의 각 값들의 이름 함수로 셋팅이 되어 각각 무슨 값을 의미하는지 파악하기 쉽다.
User user = User.builder()
.name("name");
.age(20)
.mbti("ISFJ")
.pet("milk")
.todo("todo")
.money(1000)
.build();
코드로 빌더를 만들고 그 안에서 멤버 필드별로 값을 설정하고 빌더를 반환하는 함수를 만들면 된다.
// Before:
@Builder
class Example<T> {
private T foo;
private final String bar;
}
// After: @Builder 패턴이 없으면 아래와 같이 직접 구현해줘야 한다.
class Example<T> {
private T foo;
private final String bar;
private Example(T foo, String bar) {
this.foo = foo;
this.bar = bar;
}
public static <T> ExampleBuilder<T> builder() {
return new ExampleBuilder<T>();
}
public static class ExampleBuilder<T> {
private T foo;
private String bar;
private ExampleBuilder() {}
public ExampleBuilder foo(T foo) {
this.foo = foo;
return this;
}
public ExampleBuilder bar(String bar) {
this.bar = bar;
return this;
}
@java.lang.Override public String toString() {
return "ExampleBuilder(foo = " + foo + ", bar = " + bar + ")";
}
public Example build() {
return new Example(foo, bar);
}
}
}
빌더 패턴을 적용할 객체에 @Builder를 작성해주면 된다.
@Builder
public class User{
private String name;
private int age;
private mbti;
빌더를 통해 객체를 생성할 수 있다.
User user = User.builder()
.name("name")
.age(20)
.mbti("ISFJ")
.build();