
1. 빌더 패턴이란?
빌더 패턴(Builder Pattern)은 복잡한 객체를 단계적으로 생성할 수 있도록 도와주는 생성 패턴(Creational Pattern)의 하나입니다. 객체의 생성 과정이 복잡하거나, 생성자에 많은 매개변수가 필요할 때 사용됩니다.
2. 빌더 패턴이 필요한 이유
2.1 생성자 문제 해결
생성자에 많은 매개변수가 필요한 경우, 코드의 가독성이 떨어지고 유지보수가 어려워집니다.
예제:
public class Product {
private String name;
private int price;
private String manufacturer;
private String category;
public Product(String name, int price, String manufacturer, String category) {
this.name = name;
this.price = price;
this.manufacturer = manufacturer;
this.category = category;
}
}
이렇게 매개변수가 많아지면 생성자 오버로딩도 많아지고, 가독성이 떨어집니다.
2.2 불필요한 setter 사용 방지
객체를 생성한 후 setter를 사용하여 값을 설정하면, 객체가 불변(Immutable)하지 않게 됩니다. 빌더 패턴을 사용하면 불필요한 setter 사용을 줄이고, 객체를 한 번에 완성할 수 있습니다.
3. 빌더 패턴 구조
빌더 패턴은 다음과 같은 구성 요소를 가집니다:
- Product(객체): 생성될 대상 객체
- Builder(빌더 클래스): 객체의 속성을 설정하고, 최종 객체를 생성하는 역할
- Director(선택 사항): 특정한 빌드 과정을 캡슐화하여 조합을 지정하는 역할
4. 빌더 패턴 구현 예제 (Java)
public class Product {
private final String name;
private final int price;
private final String manufacturer;
private final String category;
private Product(ProductBuilder builder) {
this.name = builder.name;
this.price = builder.price;
this.manufacturer = builder.manufacturer;
this.category = builder.category;
}
public static class ProductBuilder {
private String name;
private int price;
private String manufacturer;
private String category;
public ProductBuilder setName(String name) {
this.name = name;
return this;
}
public ProductBuilder setPrice(int price) {
this.price = price;
return this;
}
public ProductBuilder setManufacturer(String manufacturer) {
this.manufacturer = manufacturer;
return this;
}
public ProductBuilder setCategory(String category) {
this.category = category;
return this;
}
public Product build() {
return new Product(this);
}
}
@Override
public String toString() {
return "Product{name='" + name + '\'' +
", price=" + price +
", manufacturer='" + manufacturer + '\'' +
", category='" + category + '\'' +
'}';
}
}
사용 예제
public class Main {
public static void main(String[] args) {
Product product = new Product.ProductBuilder()
.setName("노트북")
.setPrice(2000000)
.setManufacturer("삼성")
.setCategory("전자기기")
.build();
System.out.println(product);
}
}
Product{name='노트북', price=2000000, manufacturer='삼성', category='전자기기'}
5. 빌더 패턴의 장점
- 가독성 향상: 메서드 체이닝 방식으로 객체를 생성하므로 코드가 더 직관적입니다.
- 불변 객체 생성 가능: setter 없이 객체를 생성하여 불변성을 유지할 수 있습니다.
- 유연성 증가: 필요한 필드만 설정할 수 있으며, 매개변수가 많아도 가독성이 유지됩니다.
6. 빌더 패턴의 단점
- 코드 증가: 빌더 클래스를 추가로 작성해야 하므로 코드의 양이 늘어납니다. 하지만 Lombok의 @Builder를 사용하면 이를 줄일 수 있습니다.
- 객체 생성 비용 증가 가능성: 빌더 패턴은 일반 생성자보다 내부적으로 객체를 한 번 더 생성하는 과정이 포함되므로 메모리 사용량이 증가할 수 있습니다. 하지만 setter를 여러 번 호출하는 방식보다 효율적일 수도 있으며, 성능 차이는 미미한 경우가 많습니다.

빌더 패턴은 복잡한 객체를 생성할 때 유용하며, 특히 많은 매개변수를 가진 객체를 생성할 때 가독성과 유지보수를 개선하는 패턴입니다.
'Back_End > Design Pattern' 카테고리의 다른 글
프록시 패턴 (Proxy Pattern) (2) | 2025.03.21 |
---|---|
싱글톤 패턴 (Singleton Pattern) (0) | 2025.02.13 |
디자인 패턴 이란? + 예시 (3) | 2025.01.03 |