팩토리 메서드 factory method 패턴 - 자바스크립트 예제

SW설계
읽는데 4분 소요
처음 쓰여진 날: 2025-09-02
마지막 수정일: 2025-09-02

요약

객체지향 프로그래밍의 핵심, GoF(Gang of Four) 디자인 패턴 중 생성 패턴인 싱글톤(Singleton), 팩토리 메서드(Factory Method), 빌더(Builder), 프로토타입(Prototype), 추상 팩토리(Abstract Factory)를 자바스크립트 코드와 함께 알아봅니다. 정처기 실기 대비를 위한 주관식 문제가 포함되어 있습니다.

팩토리 메서드 패턴 요약

패턴 종류핵심 키워드
팩토리 메서드 (Factory Method)상위 클래스 인터페이스만 정의, 실제 생성은 서브클래스 담당
팩토리 메서드 패턴 감자
팩토리 메서드 패턴 감자

팩토리 메서드 (Factory Method) 패턴

팩토리 메서드 패턴은 객체 생성을 위한 인터페이스는 상위 클래스에서 정의하되, 실제로 어떤 클래스의 인스턴스를 만들지는 하위 클래스에서 결정하도록 하는 패턴입니다.

이 패턴을 사용하면 Creator(생성자)와 Product(제품)라는 두 가지 주요 구조가 나타납니다.

  • Product: 생성될 객체의 공통 인터페이스를 정의합니다.
  • Creator: Product를 생성하는 factoryMethod()를 정의합니다. 실제 생성 로직은 하위 Creator가 담당합니다.

기본 구조

결제 시스템을 예로 들어보겠습니다. 다양한 결제 수단(카드, 페이팔 등)이 있지만, '결제 처리'라는 큰 흐름은 동일합니다.

javascript
// Product 인터페이스 (결제 게이트웨이)
class PaymentGateway {
  pay(amount) {
    throw new Error("pay()는 반드시 구현되어야 합니다.");
  }
}

// Concrete Product 1 (카드 결제)
class CardGateway extends PaymentGateway {
  pay(amount) {
    console.log(`💳 카드로 ${amount}원 결제 완료`);
  }
}

// Concrete Product 2 (페이팔 결제)
class PaypalGateway extends PaymentGateway {
  pay(amount) {
    console.log(`🅿️ 페이팔로 ${amount}원 결제 완료`);
  }
}

// Creator (상위 결제 처리기)
class PaymentProcessor {
  // 이 메서드는 구체적인 결제 방식에 의존하지 않습니다. 🎯
  process(amount) {
    const gateway = this.createGateway(); // Factory Method 호출
    gateway.pay(amount);
  }

  // Factory Method (하위 클래스가 구체적인 내용을 구현)
  createGateway() {
    throw new Error("createGateway()는 반드시 오버라이드되어야 합니다.");
  }
}

// Concrete Creator 1 (카드 결제 처리기)
class CardPaymentProcessor extends PaymentProcessor {
  createGateway() {
    return new CardGateway();
  }
}

// Concrete Creator 2 (페이팔 결제 처리기)
class PaypalPaymentProcessor extends PaymentProcessor {
  createGateway() {
    return new PaypalGateway();
  }
}

// 사용 예시 ✨
const cardProcessor = new CardPaymentProcessor();
cardProcessor.process(10000); // 💳 카드로 10000원 결제 완료

const paypalProcessor = new PaypalPaymentProcessor();
paypalProcessor.process(20000); // 🅿️ 페이팔로 20000원 결제 완료

확장성

팩토리 메서드의 가장 큰 장점은 확장성입니다. 새로운 결제 수단 '카카오페이'를 추가해야 할 경우, 기존 코드를 전혀 수정할 필요가 없습니다. 🎉

javascript
// 새로운 Concrete Product
class KakaoPayGateway extends PaymentGateway {
  pay(amount) {
    console.log(`💛 카카오페이로 ${amount}원 결제`);
  }
}

// 새로운 Concrete Creator
class KakaoPayPaymentProcessor extends PaymentProcessor {
  createGateway() {
    return new KakaoPayGateway();
  }
}

// 새로운 기능 바로 사용 가능 🚀
const kakaoProcessor = new KakaoPayPaymentProcessor();
kakaoProcessor.process(15000); // 💛 카카오페이로 15000원 결제

만약 팩토리 메서드를 사용하지 않고 단순 if/switch 분기문으로 처리했다면 어땠을까요?

javascript
function createGateway(type) {
  if (type === "card") return new CardGateway();
  if (type === "paypal") return new PaypalGateway();
  // '카카오페이' 추가 시 아래 코드 수정이 불가피합니다. 😰
  if (type === "kakaopay") return new KakaoPayGateway(); // ❌ OCP 위반
}

핵심 개념: OCP (Open-Closed Principle, 개방-폐쇄 원칙)

팩토리 메서드는 객체지향 설계 5원칙(SOLID) 중 하나인 OCP를 잘 보여줍니다.

  • 기능 확장에는 열려있다 (Open): 새로운 결제 수단(KakaoPay)을 쉽게 추가할 수 있습니다.
  • 코드 수정에는 닫혀있다 (Closed): 새로운 기능을 추가하기 위해 기존의 PaymentProcessor나 다른 결제 관련 클래스를 수정할 필요가 없습니다.

이처럼 팩토리 메서드 패턴을 사용하면 변화에 유연하고 확장성 좋은 시스템을 만들 수 있습니다.

팩토리 메서드 패턴 중요 키워드

  • 상위 클래스에서 객체를 생성하는 인터페이스를 정의하고
  • 하위 클래스에서 인스턴스를 생성한다.
  • 인터페이스와 실제 객체를 생성하는 클래스를 분리한다.

정처기 기출 문제

기출
문제
상위 클래스에서는 객체를 생성하는 인터페이스만 정의하고 실제 생성은 서브클래스에서 담당하는 패턴은?
보기
답변
정답정답 보기