topic★★★★★난이도 · 약 20분
고전 디자인 패턴 5선 — 싱글톤·팩토리·옵저버·스트래티지·데코레이터
GoF 23개 중 실무 최다 빈출 5개만 — AI가 무의식적으로 쓰는 패턴을 알아보기.
#디자인패턴#싱글톤#팩토리#옵저버#스트래티지#데코레이터
왜 배우는가
GoF 23개를 다 외울 필요는 없다. 이 5개만 알면 Claude 코드의 "왜 이렇게 짰지?" 90%가 이해된다.
디자인 패턴은 반복되는 문제의 검증된 해법. 1994년 Gang of Four(GoF)가 23개 정리. 현대 언어(JS·Python)는 상당수가 언어 기능으로 흡수 → 실무 빈출 5개만 집중.
| 패턴 | 해결하는 문제 | 실전 예 |
|---|---|---|
| 싱글톤 | 인스턴스 하나만 공유 | DB 연결 풀, 로거, 설정 |
| 팩토리 | 조건별로 다른 객체 생성 | `createPayer("toss" / "stripe")` |
| 옵저버 | 변화를 여러 구독자에 알림 | 이벤트 에미터, RxJS, React useState |
| 스트래티지 | 알고리즘을 교체 가능하게 | 정렬 비교 함수, 라우터, 미들웨어 |
| 데코레이터 | 객체·함수에 기능 덧붙이기 | React HOC, Express 미들웨어, Python `@decorator` |
typescript
// ━━━ 1) 싱글톤 ━━━
// 모듈 자체가 싱글톤 (JS·Python은 import 캐시됨 → 자동)
// db.ts
export const db = new Database(process.env.DATABASE_URL);
// import { db } 어디서든 같은 인스턴스
// ━━━ 2) 팩토리 ━━━
type PayerType = "toss" | "stripe" | "paypal";
function createPayer(type: PayerType): Payer {
switch (type) {
case "toss": return new TossPayer();
case "stripe": return new StripePayer();
case "paypal": return new PayPalPayer();
}
}
const payer = createPayer(env.PAYMENT_PROVIDER);
await payer.charge(10000);
// ━━━ 3) 옵저버 (EventEmitter) ━━━
import { EventEmitter } from "events";
const bus = new EventEmitter();
bus.on("user:registered", (user) => sendWelcomeEmail(user));
bus.on("user:registered", (user) => trackAnalytics(user));
bus.emit("user:registered", newUser);
// React의 useState도 사실상 옵저버 — setState = notify
// ━━━ 4) 스트래티지 ━━━
// "어떻게 할지"를 함수로 주입
users.sort(byAge);
users.sort(byCreatedAt);
// byAge·byCreatedAt이 각각 전략
// ━━━ 5) 데코레이터 (함수형 HOF) ━━━
function withLogging<A extends any[], R>(fn: (...a: A) => R) {
return (...args: A) => {
console.log("call", fn.name, args);
const r = fn(...args);
console.log("ret", r);
return r;
};
}
const save = withLogging(originalSave);
// Python: @logger def save(...):"고전 패턴 = 언어 관용구". 모던 JS/Python에선 클래스 없이 함수로 표현 가능.
안티패턴 주의 — 싱글톤의 함정. 전역 상태 = 테스트 어려움·병렬 처리 위험·의존성 감춰짐. 현대엔 "모듈 수준 인스턴스" 또는 의존성 주입(DI)으로 대체. 진짜 싱글톤이 필요한 건 DB 풀·로거 정도.
실기 드릴 1문항
edit실기 드릴 · 단답형
"상태 변화를 여러 구독자에 알리는" 패턴은?