디자인 패턴(생성 패턴) 실제로 어떻게 적용할까 ? (2편) feat. 빌더 , 프로토타입

소일로·2025년 1월 7일
0
post-thumbnail

디자인 패턴: 빌더 패턴과 프로토타입 패턴

. 이번 글에서는 빌더 패턴(Builder Pattern)과 프로토타입 패턴(Prototype Pattern)에 대해 알아보고, 각각의 실제 활용 사례, 장단점, 그리고 유의점을 살펴보겠습니다.


1. 빌더 패턴 (Builder Pattern)

언제 사용할까?

  • 복잡한 객체를 단계적으로 생성해야 할 때: 객체 생성 과정에서 옵션이 많거나, 여러 단계가 필요한 경우.
  • 동일한 생성 프로세스를 통해 다른 표현의 객체를 만들어야 할 때.

실제 적용

  • Spring: StringBuilder는 문자열을 동적으로 생성할 때 사용됩니다.
  • NestJS: ConfigService를 활용해 환경별로 다른 설정을 단계적으로 구성할 수 있습니다.

코드 예제 (Java)

java
class Product {
    private String partA;
    private String partB;
    private String partC;

    public static class Builder {
        private String partA;
        private String partB;
        private String partC;

        public Builder setPartA(String partA) {
            this.partA = partA;
            return this;
        }

        public Builder setPartB(String partB) {
            this.partB = partB;
            return this;
        }

        public Builder setPartC(String partC) {
            this.partC = partC;
            return this;
        }

        public Product build() {
            Product product = new Product();
            product.partA = this.partA;
            product.partB = this.partB;
            product.partC = this.partC;
            return product;
        }
    }

    @Override
    public String toString() {
        return "Product [partA=" + partA + ", partB=" + partB + ", partC=" + partC + "]";
    }
}

// 사용
Product product = new Product.Builder()
                    .setPartA("Engine")
                    .setPartB("Wheels")
                    .setPartC("Chassis")
                    .build();

System.out.println(product);

장점

  • 객체 생성 과정을 분리하여 가독성을 높인다.
  • 생성 과정에서의 유연성과 확장성을 제공한다.
  • 불변 객체를 쉽게 생성할 수 있다.

유의점

  • 생성 과정이 단순한 객체에는 과도한 설계가 될 수 있다.
  • 추가적인 빌더 클래스 작성으로 코드가 증가할 수 있다.

2. 프로토타입 패턴 (Prototype Pattern)

언제 사용할까?

  • 객체 생성 비용이 높은 경우: 복잡한 초기화 과정이나 대량 생성 시 사용.
  • 기존 객체를 복사(클론)하여 새로운 객체를 생성해야 할 때.
  • 객체의 상태가 중요하며, 초기 상태를 복제하여 사용해야 할 때.

실제 적용

  • Spring: Bean의 스코프 중 prototype을 사용하면, 매번 새 객체를 생성합니다.
  • JavaScript: Object.create()를 통해 프로토타입을 기반으로 객체를 생성합니다.

코드 예제 (Java)

java
class Prototype implements Cloneable {
    private String field;

    public Prototype(String field) {
        this.field = field;
    }

    public void setField(String field) {
        this.field = field;
    }

    public String getField() {
        return field;
    }

    @Override
    protected Prototype clone() throws CloneNotSupportedException {
        return (Prototype) super.clone();
    }

    @Override
    public String toString() {
        return "Prototype [field=" + field + "]";
    }
}

// 사용
Prototype original = new Prototype("Original");
try {
    Prototype clone = original.clone();
    clone.setField("Clone");
    System.out.println(original); // Prototype [field=Original]
    System.out.println(clone);    // Prototype [field=Clone]
} catch (CloneNotSupportedException e) {
    e.printStackTrace();
}

장점

  • 객체 생성 비용을 줄일 수 있다.
  • 런타임 시점에서 객체의 구체적인 타입을 알 필요가 없다.
  • 새로운 객체를 생성하지 않고, 기존 객체의 상태를 유지하며 확장 가능하다.

유의점

  • 얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy)의 차이를 이해하고 적용해야 한다.
  • 복사 과정에서 순환 참조가 있는 경우 처리가 까다로울 수 있다.
  • Java의 경우 Cloneable 인터페이스 사용이 권장되지 않는 경우도 있다.

빌더 패턴 vs 프로토타입 패턴 비교

특징빌더 패턴프로토타입 패턴
목적복잡한 객체 생성객체의 복제
유연성생성 과정의 유연성 제공런타임 시점의 상태 복제
적용 시점생성 단계가 복잡한 경우 사용객체 생성 비용이 높은 경우 사용
코드 작성 방식빌더 클래스를 작성클론 메서드 구현

결론

  • 빌더 패턴은 복잡한 객체를 명시적이고 유연하게 생성해야 할 때 유용하며, 가독성과 확장성을 높입니다.
  • 프로토타입 패턴은 객체를 복사하는 방식으로 생성 비용을 줄이고, 기존 객체 상태를 유지하면서 유사한 객체를 생성할 때 유리합니다.

두 패턴 모두 특정 문제에 적합한 솔루션을 제공하며, 상황에 맞게 선택하는 것이 중요합니다. 🚀

profile
백엔드 개발자

0개의 댓글