
✅ Builder 패턴이란?
- GoF 디자인 패턴 중 *생성 패턴에 해당.
- 객체를 생성 방법과 표현 방법을 분리하여, 동일한 절차에서도 서로 다른 표현을 생성하는 방법 제공.
→ 생성자를 가독성 좋게 만들어주는 도구.
- builder() 메서드를 통해 셋팅하고자하는 값을 직접 세팅.
* 생성 패턴 : 인스턴스를 만드는 절차를 추상화한 패턴.
📌 Builder 패턴 사용 이유
: 객체 생성을 가독성있고 유연하게 적용하기 위해 사용.
→ 생성자 인자가 많을 때, 빌터 패턴 적용 (Effective Java 2 中)
✅ Builder 패턴 장점
📌 1. 필요한 데이터만 설정 가능
- 생성자로 객체를 생성할 시, 특정 인자를 사용하지 않고 싶으면 해당 인자에 더미 값을 넣거나, 해당 인자가 없는 생성자를 새로 만들어야하지만, 빌더 패턴을 사용하면 불필요한 인자를 빼고 객체를 생성할 수 있다.
- 더미값을 넣는 방법
// 1. 더미 값
User user = new User("홍길동", 0, 50);
- 새로운 생성자를 추가하는 방법
// 2. 새로운 생성자 추가
@NoArgsConstructor
@AllArgsConstrctor
public class User{
private String name;
private int age;
private int weight;
public User(String name, int weight){
this.name = name;
this.weight = weight;
}
}
- 빌더 패턴 사용
// 3. 빌더 패턴 사용
User user = User.builder()
.name("홍길동")
.weight(50)
.build();
📌 2. 유연성 확보 가능.
- 생성자로 객체를 만들면 새로운 객체 추가 시, 기존 모든 코드를 수정해야하지만, 빌더패턴을 사용하면 새로운 변수가 추가되어도 기존의 코드에 영향을 주지 않음.
- 데이터 순서에 상관없이 객체 생성 가능.
📌 3. 가독성 향상.
- 명시적 선언으로 각 인자가 어떤 의미인지 이해하기 쉽다.
- 불필요한 생성자를 제거할 수 있다.
📌 4. 불변성 확보 가능.
- setter 가 없으므로 변경 불가능한 객체를 만들수 있다. (객체불변성)많은 개발자들이 setter 패턴을 사용하는데, 이는 불필요하게 확장가능성을 열어두는 것이다.그러므로, 클래스 변수를 final로 선언 / 객체생성은 빌더를 쓰는 것이 좋다.
@RequiredArgsConstructor
@Builder
public class User{
private final String name;
private final int age;
private final int weight;
}
✅ Builder 패턴 적용법 ( + @Builder 애너테이션 / 예시 )
@Builder
: 빌더를 적용하고 싶은 클래스 or 생성자 위에 @Builder 애너테이션을 붙이면 간단하게 빌더 패턴 사용 가능.
하지만 lombok documents 에서는 @Builder를 생성자에 추가하라고 명시하고 있음.
- 클래스 전체에 Builder 적용
// 클래스에 빌더 애너테이션 적용.
@Getter
@Builder
public class Pesron {
private String name;
private int age ;
private int weight;
}
// 구성한 빌더를 통해 호출 수행.
Person person = Person.builder()
.name("홍길동")
.age(20)
.weight(50)
.build();
- 특정 생성자에만 Builder 적용
// name, age 만 인자로 받는 생성자에만 빌더 적용.
@Getter
public class Person {
private String name;
private int age ;
private int weight;
@Builder // name, age 만 빌더 사용 가능
public Person (String name, ing age) {
this.name = name;
this.age = age;
}
public Person (String name, int age, int weight) {
this.name = name;
this.age = age;
this.weight = weight
}
}
// 구성한 빌더를 통해 최종 호출 (객체 생성)
Person person = Person.builder()
.name("홍길동")
.age(20)
.build();
}
참고자료:
https://pamyferret.tistory.com/67