C#/문법

C# ObserverPattern (옵저버 패턴)

psb08 2025. 10. 7. 22:38
728x90
반응형

옵저버 패턴

옵저버 패턴은 한 객체(Subject / Observable) 의 상태 변화가 있을 때 그 변화를 여러 객체(Observers) 에게 자동으로 통지해 주기 위한 디자인 패턴입니다.

주요 목적은 발행자(Subject)구독자(Observer) 를 분리하여 결합도를 낮추는 것입니다.

발행자는 누가 구독했는지 몰라도 되고, 구독자는 발행자에게 직접 명령하지 않아도 됩니다.

 

핵심 요소

Subject 발행자 : Observer 등록/해제/알림 기능을 제공하고 상태를 관리합니다.

Observer 구독자 : Subject의 변경을 받아 처리하는 쪽입니다.


장점

느슨한 결합 Subject와 Observer가 서로를 구체적으로 몰라도 통신 가능합니다.
→ 재사용성, 유지보수성이 뛰어납니다.
확장성 새로운 Observer 추가가 쉽습니다. 기존 코드 수정이 거의 필요 없습니다.
자동 업데이트 Subject 상태 변경 시 자동으로 Observer에게 반영됩니다.
→ 데이터 일관성 유지가 쉽습니다.
이벤트 시스템에 적합 UI 변경, 센서 이벤트, 로그 시스템 등 “변화 감지 → 반응”하는 구조에 이상적입니다.

단점

어려운 디버깅 Observer가 많으면 누가 언제 Notify를 받는지 추적이 어렵습니다.
예측 어려움 한 Subject 변경이 여러 Observer의 Update를 일으켜 도미노처럼 호출될 수 있습니다.
성능 문제 Observer 수가 많거나 Update 로직이 복잡하면 Notify 한 번에 많은 리소스를 사용해 성능에 문제가 생길 수 있습니다.
메모리 누수 위험 Observer가 해제되지 않으면 Subject가 계속 참조합니다. → GC(가비지 컬렉션)되지 않기에 메모리 누수 문제가 생길 수 있습니다.
양방향 의존 가능성 Observer가 Subject를 직접 참조하면 결합도가 다시 높아질 수 있습니다.

 


옵저버 패턴의 모델

옵저버 패턴은 Subject와 Observer 사이의 데이터 전달 방식에 따라 두 가지로 나눌 수 있습니다.

Pull모델과 Push모델, 두 가지가 있습니다.

구분 설명 특징 장단점
Pull 모델 Observer가 직접 Subject에서 필요한 데이터를 가져옵니다. Subject는 단순히 변경됐다고만 알립니다. 단순하지만 불필요한 데이터 접근이 많을 수 있습니다.
Push 모델 Subject가 변경된 데이터를 Observer에게 전달합니다. Observer가 Update 호출 시 데이터를 바로 받습니다. 데이터 전달이 명확하지만 Subject와 Observer 간 결합도가 증가할 수 있습니다.