
소프트웨어 개발
Observer Pattern옵저버 패턴
옵저버 패턴(Observer Pattern)은 객체(Subject)의 상태 변화를 여러 구독자(Observer)에게 자동으로 알리는 행위 디자인 패턴이다. 이벤트 시스템, UI 반응형 프로그래밍, 메시지 브로커의 기반이다.
구조
Subject (Observable)
- observers: List
- subscribe(observer)
- unsubscribe(observer)
- notify()
↓ (상태 변화 시 notify 호출)
Observer 1 Observer 2 Observer 3
update() update() update()구현
python
from abc import ABC, abstractmethod
from typing import List
class Observer(ABC):
@abstractmethod
def update(self, event: str, data: dict): ...
class Subject:
def __init__(self):
self._observers: List[Observer] = []
def subscribe(self, observer: Observer):
self._observers.append(observer)
def unsubscribe(self, observer: Observer):
self._observers.remove(observer)
def notify(self, event: str, data: dict):
for observer in self._observers:
observer.update(event, data)
# 실제 Subject
class OrderService(Subject):
def place_order(self, order):
# ... 주문 처리 ...
self.notify("order_placed", {"order_id": order.id})
# Observer 구현
class EmailNotifier(Observer):
def update(self, event, data):
if event == "order_placed":
send_email(f"주문 확인: #{data['order_id']}")
class InventoryUpdater(Observer):
def update(self, event, data):
if event == "order_placed":
update_stock(data['order_id'])
# 사용
service = OrderService()
service.subscribe(EmailNotifier())
service.subscribe(InventoryUpdater())
service.place_order(order)
# → EmailNotifier와 InventoryUpdater 자동 실행이벤트 에미터 (Node.js)
javascript
const EventEmitter = require('events');
class OrderService extends EventEmitter {
placeOrder(order) {
// ... 처리 ...
this.emit('order_placed', order);
}
}
const service = new OrderService();
service.on('order_placed', (order) => sendEmail(order));
service.on('order_placed', (order) => updateInventory(order));관련 개념
- •디자인 패턴 — 옵저버 패턴의 카테고리
- •이벤트 드리븐 — 옵저버 패턴이 구현하는 아키텍처
- •메시지 큐 — 분산 옵저버 패턴
- •리액티브 프로그래밍 — 옵저버 패턴의 확장
