Observer 패턴은 특정 객체의 상태 변화가 있을 때 이를 구독하고 있는 객체들에게 자동으로 알림을 전달하는 디자인 패턴입니다. Observable(혹은 Subject)은 특정 이벤트가 발생할 때 이를 Observer들에게 전파합니다.
주로 이벤트 기반 프로그래밍에서 사용되며, 예를 들어 블로그의 새 글 알림 시스템에서는 새로운 글이 등록될 때 모든 구독자에게 알림을 보내는 식으로 구현할 수 있습니다.
Observer 패턴의 기본 구조는 관찰 대상(Subject)과 여러 관찰자(Observer)로 구성된 일대다 관계입니다. 구체적인 흐름은 다음과 같습니다.
JavaScript에서는 Observer 패턴을 통해 이벤트 리스너를 추가하고, 이벤트 발생 시 동작을 수행하게 할 수 있습니다.
간단한 예제를 통해 Observer 패턴을 구현해보겠습니다.
// 주체가 되는 Subject 클래스
class Subject {
private observers: Function[];
constructor(){
this.observer = [];
}
// Observer 구독
subscribe<T>(observer: (param: T) => void){
this.observer.push(observer);
}
// Observer 구독 해제
unsubscribe<T>(observer: (param: T) => void){
this.observer = this.observer.filter(obs => obs !== observer);
}
// 알림 전송
notify<T>(data: T){
this.observer.forEach(observer => observer(data));
}
}
subscribe 메서드를 통해 Observer를 등록하고, unsubscribe 메서드를 통해 Observer의 구독을 해지할 수 있습니다. notify 메서드를 호출하면 등록된 모든 Observer에게 이벤트가 전파됩니다.
// 사용 예시
const subject = new Subject();
const observer1 = (data: string) => { console.log(`Observer 1 received data: ${data}`) };
const observer2 = (data: string) => { console.log(`Observer 2 received data: ${data}`) };
subject.subscribe(observer1);
subject.subscribe(observer2);
// 알림 발생
subject.notify('hello');
/*
Observer 1 received data: hello
Observer 2 received data: hello
*/
// observer1을 구독 해제 후 알림 재전송
subject.unsubscribe(observer1);
subject.notify('second message');
/* Observer 2 received data: second message */
위 예제에서는 notify 메서드를 호출하면 등록된 Observer의 함수가 실행되어 Observer 1, Observer 2 모두 데이터 알림을 수신하게 됩니다.
Observer 패턴은 이벤트 기반 애플리케이션에서 객체 간 결합도를 낮추면서 이벤트를 효율적으로 처리할 수 있는 강력한 패턴입니다. JavaScript의 객체 지향 기능을 활용하여 Observer 패턴을 쉽게 구현할 수 있으며, 이를 통해 코드의 재사용성과 유지보수성을 높일 수 있습니다.