핵심 인사이트 (3줄 요약)
- 일대다 의존성 정의: 어떤 객체(Subject)의 상태가 변하면 그 객체에 의존하는 모든 옵저버(Observer)들에게 알림이 가도록 관계를 설정한다.
- 느슨한 결합 (Loose Coupling): 주제 객체는 옵저버의 구체적인 구현을 몰라도 되며, 런타임에 동적으로 구독자를 추가하거나 제거할 수 있다.
- 분산 이벤트 핸들링: MVC 아키텍처나 비동기 이벤트 기반 시스템에서 상태 변화를 효율적으로 전파하는 핵심 매커니즘이다.
Ⅰ. 개요 (Context & Background)
옵저버 패턴은 행위 패턴(Behavioral Patterns) 중 하나로, 발행-구독(Publish-Subscribe) 모델로도 잘 알려져 있다. 특정 데이터의 변화를 감시(Observe)하고 있다가 변화가 발생하면 자동으로 반응해야 하는 시스템 설계에서 가장 보편적으로 사용된다.
Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)
옵저버 패턴은 상태를 가진 'Subject'와 이를 지켜보는 'Observer' 간의 1:N 관계로 구성된다.
[ Architecture of Observer Pattern ]
+-------------------------+ +-------------------------+
| Subject (Interface) |<---------| Observer (Interface) |
+-------------------------+ +-------------------------+
| + register(Observer) | | + update(data) |
| + remove(Observer) | +-------------------------+
| + notifyObservers() | ^
+-------------------------+ | (Implements)
^ +-------------------------+
| (Implements) | ConcreteObserver |
+-------------------------+ +-------------------------+
| ConcreteSubject | | + update(data) { |
|-------------------------| | // react to state |
| - state: Object | | } |
| - observers: List | +-------------------------+
+-------------------------+
| + getState() |
| + setState(new) |
+-------------------------+
(Calls notifyObservers on set)
핵심 메커니즘:
- Subject: 옵저버들을 리스트로 관리하며, 자신의 상태가 변경되면 리스트의 모든 옵저버들에게
update()메서드를 호출하여 알린다. - Observer: 데이터 변경 시 실행될 행위를 정의하는 공통 인터페이스이다.
- Push vs Pull: 데이터를 Subject가 직접 전달(Push)할지, 옵저버가 직접 가져가게(Pull) 할지 방식이 나뉜다.
Ⅲ. 융합 비교 및 다각도 분석 (Comparison & Synergy)
| 비교 항목 | 옵저버 패턴 (Observer) | 책임 연쇄 패턴 (CoR) |
|---|---|---|
| 통신 방식 | 일대다 (1:N) 방송 방식 | 일대일 (1:1) 체인 전달 방식 |
| 결합 형태 | 다수의 구독자가 동시에 반응 | 순차적으로 처리할 수 있는 자를 찾음 |
| 흐름 제어 | 비동기적/병렬적 통지 위주 | 순차적/선형적 흐름 제어 위주 |
| 주요 용도 | UI 업데이트, 알림 서비스 | 유효성 검사, 이벤트 버블링 |
Ⅳ. 실무 적용 및 기술사적 판단 (Strategy & Decision)
실무 적용 사례:
- MVC 아키텍처: 모델(Model)의 데이터가 변하면 뷰(View)가 이를 감지하여 화면을 갱신할 때 사용된다.
- GUI 이벤트: 버튼 클릭 시 여러 개의 이벤트 리스너(Listener)가 동시에 동작하는 구조이다.
- 구독 서비스: SNS의 팔로잉 시스템이나 주식 시장의 실시간 시세 알림 등이 대표적이다.
기술사적 판단: "옵저버 패턴은 시스템의 **확장성(Scalability)**을 높여주지만, 너무 많은 옵저버가 등록될 경우 성능 저하나 순환 참조(Circular Reference) 리스크가 발생할 수 있다. 따라서 통지 순서가 중요하지 않은 경우에 사용하며, 필요한 경우 이벤트 버스(Event Bus)를 통한 간접화를 고려해야 한다."
Ⅴ. 기대효과 및 결론 (Future & Standard)
옵저버 패턴은 현대적인 리액티브 프로그래밍(Reactive Programming)과 RxJS, Kafka 등의 비동기 데이터 스트림 처리의 근간이 되는 중요한 철학이다. 객체 간의 결합도를 최소화하면서도 일관성을 유지할 수 있는 가장 강력한 도구 중 하나이다.
📌 관련 개념 맵 (Knowledge Graph)
- Mediator Pattern: 객체 간 복잡한 M:N 통신을 중재자가 관리 (옵저버와 결합 가능)
- Publish-Subscribe: 메시지 브로커를 둔 옵저버의 확장 형태
- Event-Driven Architecture: 시스템 전반에 옵저버 패턴 사상을 적용
👶 어린이를 위한 3줄 비유 설명
- 유튜브 채널을 '구독'하고 '알림 설정'을 해두면, 유튜버가 새 영상을 올릴 때마다 여러분에게 자동으로 알림이 가는 것과 같아요.
- 여러분이 일일이 채널에 들어가서 확인하지 않아도 되니까 아주 편하죠?
- 유튜버는 누가 자기 영상을 보는지 일일이 알 필요 없이, 그냥 알림만 '뿅' 하고 보내면 된답니다.