팩토리 메서드 factory method 패턴 - 자바스크립트 예제
SW설계
읽는데 4분 소요
처음 쓰여진 날: 2025-09-02
마지막 수정일: 2025-09-02
조회수: 27
요약
객체지향 프로그래밍의 핵심, 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
나 다른 결제 관련 클래스를 수정할 필요가 없습니다.
이처럼 팩토리 메서드 패턴을 사용하면 변화에 유연하고 확장성 좋은 시스템을 만들 수 있습니다.
팩토리 메서드 패턴 중요 키워드
- 상위 클래스에서 객체를 생성하는 인터페이스를 정의하고
- 하위 클래스에서 인스턴스를 생성한다.
- 인터페이스와 실제 객체를 생성하는 클래스를 분리한다.
정처기 기출 문제
기출 | |
문제 | 상위 클래스에서는 객체를 생성하는 인터페이스만 정의하고 실제 생성은 서브클래스에서 담당하는 패턴은? |
보기 | |
답변 | |
정답 | 정답 보기 |