복잡한 Object들을 단계별로 구축할 수 있는 생성 디자인 패턴
- 이를 이용하면 동일한 구성코드를 사용해 다양한 타입과 표현을 제공한다.
=> 즉 생성자를 가독성 있게 만들어주는 도구라고 생각하자.
라는 생각을 할 수도 있을텐데 Setter를 쓰면 가독성은 좋지만 다른 문제가 생긴다.
객체의 값을 바꾼다는 것은 보통 비즈니스 로직을 위해서 바꾸지만 Setter를 이용하는 경우에선 무슨 의도를 가지고 하였는지 알 수 없다.
Setter를 쓰게 된다면, 객체 하나를 만들기 위해서 함수를 여러개 호출해야되고,
객체가 완전히 생성되기 전까지는 일관성이 무너진 상태에 놓이게 된다.
이런 이유 때문에 빌더 패턴이 필요하고 권장하고 있다.
⚡️ 이펙티브 자바 책에서도 아래와 같이 이야기 한다.
생성자나 정적 팩터리가 처리해야 할 매개변수가 많다면 빌더 패턴을 선택하는 게 더 낫다
기본적으로 @Builder
어노테이션을 사용하면 간단히 사용할 수 있다.
@Getter @Builder // ✨ 클래스 전체 필드를 빌더로 사용 가능!
public class UserLombok {
private Long id;
private String email;
private String password;
private String name;
}
// 사용예제
public User join(String email, String password, String name) {
UserLombok build = UserLombok.builder()
.email(email)
.password(password)
.name(name)
.build();
...
}
@Getter
public class UserLombok {
private Long id;
private String email;
private String password;
private String name;
@Builder // ✨ 빌더는 email, password만 사용 가능
public UserLombok(String email, String password) {
this.email = email;
this.password = password;
}
public UserLombok(Long id, String email, String password, String name) {
this.id = id;
this.email = email;
this.password = password;
this.name = name;
}
}
// 사용예제 - email, password만 가능!
public User join(String email, String password, String name) {
UserLombok build = UserLombok.builder()
.email(email)
.password(password)
.build();
...
}