Back_End/Design Pattern

빌더 패턴(Builder Pattern)

10Biliion 2025. 3. 19. 09:27

 

 

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