객체지향 프로그래밍 디자인 패턴 중 하나로, 객체의 상태 변화가 있을 때 그 변화를 관찰하는 옵저버 객체들에게 자동으로 통보하는 방식. 주로 상태 관리나 이벤트 시스템에서 많이 사용된다.
class Subject{
constructor(){
this.observers=[];
}
subscribe(observer){
this.observers.push(observer);
}
unsubsribe(observer){
this.observers=this.observers.filter(obs=>obs!==observer);
}
notify(data){
this.observers.forEach(observer=>observer.update(data));
}
}
class Observer{
constructor(name){
this.name=name;
}
update(data){
console.log(`${this.name} received data: ${data}`);
}
}
const subject=new Subject();
const observer1=new Observer('Observer1');
const observer2=new Observer('Observer2');
subject.subcribe(observer1);
subject.subsribe(observer2);
subject.notify('Hello, Observers!);
// Observer 1 received data: Hello, Observers!
// Observer 2 received data: Hello, Observers!
실생활로 예를 들면 다음과 같다.
인기있는 맛집에서는 오픈 전에도 웨이팅 목록을 작성할 수 있다. 여기서 고객들(Observer)은 해당 맛집(Subject)의 웨이팅 목록에 고객 정보를 작성(subsribe)할 수 있다.
손님을 받을 수 있는 준비가 되면 가게에서 고객들에게 고객 정보를 바탕으로 동시에 문자 알림(notify)를 보낼 수 있다.
그러면 각 고객들(Observer)들은 맛집의 상태 변화를 감지하고 가게에 가는 행동(update)를 하게 된다.
이벤트 시스템
상태 관리 라이브러리
보통 상태 관리 라이브러리와 DOM 이벤트 리스너를 사용해서 개발하기 때문에 직접 옵저버 패턴을 구현하는 일을 드물 것 같지만, 간접적으로 사용할 경우가 많기 때문에 개념을 이해하고 있으면 좋을 것 같다.