🎨 JavaScript 디자인 패턴 실전편|모듈 패턴부터 옵저버, 전략 패턴까지 코드로 이해하기
안녕하세요, 퍼블리셔 노미입니다! 😊
이전 글에서 우리는 JavaScript의 모듈 시스템과 기본적인 디자인 패턴을 배웠어요.
그럼 이번에는 진짜로 실무에서 써먹을 수 있도록, "코드로 체감하는 디자인 패턴 실전 예제"를 준비했어요! 💡
이 글에서는 다음과 같은 패턴을 코드 예시 중심으로 풀어봅니다:
- 📦 모듈 패턴(Module Pattern)
- 👑 싱글턴 패턴(Singleton Pattern)
- 🏭 팩토리 패턴(Factory Pattern)
- 👀 옵저버 패턴(Observer Pattern)
- 🎯 전략 패턴(Strategy Pattern)
실전 예제 + 사용 시점까지 부드럽고 꼼꼼하게 설명할게요! 시작합니다! 🚀
📦 모듈 패턴 (Module Pattern)
모듈 패턴은 변수를 캡슐화하고, 필요한 기능만 외부에 노출하는 패턴이에요. IIFE (즉시 실행 함수)
를 사용해 클로저를 활용하는 게 핵심! 🔐
📌 예시 코드
const Counter = (function () {
let count = 0;
function increase() {
count++;
console.log(count);
}
function reset() {
count = 0;
}
return {
increase,
reset,
};
})();
Counter.increase(); // 1
Counter.increase(); // 2
Counter.reset();
Counter.increase(); // 1
- 🔒 내부 상태는 외부에서 직접 접근 불가
- 🔧 필요한 기능만 리턴 객체에 노출
→ 전역 오염 없이 재사용 가능한 유틸 모듈 제작에 유리! ✅
👑 싱글턴 패턴 (Singleton Pattern)
싱글턴 패턴은 인스턴스를 오직 하나만 만들도록 보장하는 패턴이에요. 전역 설정, 유저 세션, 알림 센터 같은 곳에서 자주 써요. 🌐
📌 예시 코드
class Config {
constructor() {
if (Config.instance) {
return Config.instance; // 이미 있으면 그거 반환
}
this.mode = 'dark';
Config.instance = this;
}
toggle() {
this.mode = this.mode === 'dark' ? 'light' : 'dark';
}
}
const a = new Config();
const b = new Config();
console.log(a === b); // true
- 🧠 생성자 안에서 인스턴스를 저장하고 재활용
- 🚫 여러 개 만들 수 없음 = 상태 공유
→ 앱 전체 설정, 공통 상태 관리에 딱! 🧭
🏭 팩토리 패턴 (Factory Pattern)
팩토리 패턴은 객체 생성 로직을 하나의 함수로 캡슐화하는 패턴이에요. 특정 조건에 따라 다른 객체를 만들어주는 '공장' 같다고 보면 돼요! 🏭
📌 예시 코드
class Dog {
speak() {
return '멍멍!';
}
}
class Cat {
speak() {
return '야옹~';
}
}
function AnimalFactory(type) {
if (type === 'dog') return new Dog();
if (type === 'cat') return new Cat();
return null;
}
const pet = AnimalFactory('dog');
console.log(pet.speak()); // 멍멍!
- 📥 객체 생성 방식 추상화
- 💡 클라이언트는 내부 로직 몰라도 됨
→ 코드 확장성과 유지보수가 훨씬 쉬워져요! 🔧
👀 옵저버 패턴 (Observer Pattern)
옵저버 패턴은 하나의 객체 상태가 바뀔 때, 그걸 구독 중인 객체들에 자동 알림을 보내는 구조예요. 이벤트 시스템이나 리액티브 상태 관리에 많이 써요! 📡
📌 예시 코드
class Subject {
constructor() {
this.observers = [];
}
subscribe(fn) {
this.observers.push(fn);
}
notify(data) {
this.observers.forEach(fn => fn(data));
}
}
// 사용
const state = new Subject();
state.subscribe((msg) => console.log('Logger:', msg));
state.subscribe((msg) => console.log('Analytics:', msg));
state.notify('🟢 사용자 로그인');
// Logger: 사용자 로그인
// Analytics: 사용자 로그인
- 🔔 한 번의 상태 변경 = 여러 구독자 반응
- 💬 구독(subscribe) / 알림(notify) 구조
→ 상태 연동, 실시간 반응형 앱 구현에 딱! ⚡
🎯 전략 패턴 (Strategy Pattern)
전략 패턴은 동일한 작업을 다양한 방식으로 수행할 수 있도록 전략(함수)을 분리하는 구조예요. 예: 정렬, 할인 정책, 인증 방식 등 다양한 전략을 상황에 따라 바꿀 수 있어요! ♻️
📌 예시 코드
class PaymentContext {
setStrategy(strategy) {
this.strategy = strategy;
}
pay(amount) {
this.strategy.pay(amount);
}
}
class CardPayment {
pay(amount) {
console.log(`💳 카드로 ${amount}원 결제`);
}
}
class KakaoPay {
pay(amount) {
console.log(`📱 카카오페이로 ${amount}원 결제`);
}
}
// 사용
const payment = new PaymentContext();
payment.setStrategy(new CardPayment());
payment.pay(5000); // 💳 카드로 5000원 결제
payment.setStrategy(new KakaoPay());
payment.pay(7000); // 📱 카카오페이로 7000원 결제
- 🔄 전략은 클래스 또는 함수로 분리
- 🧠 Context는 전략만 갈아끼움
→ 유연한 조건별 로직 처리에 최고예요! 🧩
🧭 디자인 패턴 사용 시기 정리표
패턴 | 사용 시점 | 대표 상황 |
---|---|---|
📦 모듈 | 코드 캡슐화 | 유틸 함수, 전역 충돌 방지 |
👑 싱글턴 | 하나의 상태 유지 | 앱 설정, 전역 캐시 |
🏭 팩토리 | 유사 객체 다양하게 생성 | 동물, 버튼 등 타입 분기 |
👀 옵저버 | 상태 변경 감지 | 이벤트 시스템, 알림센터 |
🎯 전략 | 동작 방식 교체 | 결제, 로그인, 정렬 전략 |
→ 상황에 맞는 패턴을 골라 쓰는 게 중요! 🧠
📚 마무리하며
디자인 패턴은 단순한 “문법 공식”이 아니라 코드를 더 유연하고 유지보수 가능하게 만드는 설계 아이디어입니다. 🧩
오늘 정리한 모듈, 싱글턴, 팩토리, 옵저버, 전략 패턴은 실전 JavaScript 프로젝트에서 자주 쓰이는 핵심 패턴이에요. 🚀
✅ 이 글에서 배운 핵심
- 📦 모듈 패턴 → 클로저와 캡슐화
- 👑 싱글턴 → 상태 공유와 전역 제어
- 🏭 팩토리 → 객체 생성 로직 분리
- 👀 옵저버 → 상태 감지와 반응 처리
- 🎯 전략 → 유연한 동작 방식 선택
다음 글에서는 디자인 패턴 고급편: 컴포지트, 상태, 커맨드 패턴도 이어서 풀어볼게요!
끝까지 읽어주신 여러분, 💖 정말 감사합니다! 함께 더 성장해요! 🌱
#JavaScript패턴 #디자인패턴실전 #옵저버패턴 #전략패턴 #팩토리패턴 #프론트엔드설계 #퍼블리셔노미 #코드유지보수 #JS패턴정리 #개발자성장
'차근차근' 카테고리의 다른 글
JavaScript 이벤트 루프 완전 정복|콜 스택, 태스크 큐, 마이크로태스크 한눈에 이해하기 (1) | 2025.05.21 |
---|---|
JavaScript 비동기 패턴 완전 정복|콜백부터 async/await, 병렬 처리까지 한 번에! (1) | 2025.05.20 |
프론트엔드 개발 환경 완전 정복|Webpack, Vite, Babel로 모던 프로젝트 세팅하기 (1) | 2025.05.18 |
JavaScript 모듈 시스템 완전 정복|import/export부터 구조 설계까지 한 번에! (1) | 2025.05.17 |
JavaScript 에러 처리와 디버깅 완전 정복|try-catch, throw, 디버깅 실전 방법 (1) | 2025.05.08 |