Programming

Observer 패턴 (Pub/Sub, 이벤트 리스너)

ipxy 2025. 4. 17. 07:42
728x90

👀 Observer 패턴 (관찰자 패턴)

✅ 정의

객체의 상태 변화가 있을 때, 그 변화를 관심 있는 다른 객체(옵저버)에게 자동으로 알려주는 디자인 패턴

즉, **“어떤 객체를 관찰하고 있다가, 변화가 생기면 알려줘!”**라는 구조를 구현하는 방식입니다.


🎯 기본 구성 요소

구성요소 설명
Subject 관찰 대상. 상태가 변경되면 옵저버들에게 알림
Observer 변화를 감지하고 반응하는 객체
Notify() Subject가 상태 변화 시 Observer에게 알리는 메서드

🧵 구조 

Subject (Publisher)
 ├── observers[] 등록
 └── 상태 변경 시 notify() 호출
         ↓
Observer A (Subscriber)
Observer B (Subscriber)

📦 예제 – 자바 코드

// Observer 인터페이스
interface Observer {
    void update(String message);
}

// Subject 클래스
class Subject {
    List<Observer> observers = new ArrayList<>();

    void addObserver(Observer obs) {
        observers.add(obs);
    }

    void notifyObservers(String message) {
        for (Observer obs : observers) {
            obs.update(message);
        }
    }

    void changeSomething() {
        notifyObservers("변경됨!");
    }
}

🔁 Observer 패턴 vs Pub/Sub (발행-구독)

 

항목  Observer Pattern  Pub/Sub Pattern
연결 방식 Subject가 Observer 직접 참조 Publisher, Subscriber 간 직접 연결 없음
알림 전달 Subject → Observer 직접 호출 중간에 Broker(중재자) 를 둠
구현 위치 로컬 메모리 내 객체 간 통신 네트워크 기반(비동기 메시징)
예시 UI 버튼 클릭 이벤트 Kafka, Redis Pub/Sub, MQTT

🔄 정리하자면:

Observer는 “코드 내부”의 객체 간 상태 감지,
Pub/Sub는 “분산 시스템”에서의 비동기 통신 방식


📬 이벤트 리스너(Event Listener)

✅ 정의

특정 이벤트가 발생했을 때 실행되는 콜백(callback) 함수

  • 보통 UI 프레임워크, 브라우저, Node.js, 게임엔진 등에서 많이 사용
  • 내부적으로는 Observer 패턴 기반인 경우가 많음

✅ 예시 (JavaScript)

button.addEventListener("click", () => {
  console.log("버튼이 클릭됨!");
});

🔨 대표 적용 사례

분야 적용 예시
UI 프로그래밍 버튼 클릭 → 이벤트 리스너 등록
비동기 메시징 시스템 Kafka, Redis → Pub/Sub 패턴
RxJava, RxJS Observable/Observer 구조
React / Vue 상태 변화 감지 후 자동 리렌더링
서버 이벤트 처리 Spring Event, Node.js EventEmitter
게임 개발 캐릭터 상태 변화 감지, 충돌 이벤트 등

🔍 비슷한 듯 다른 개념 차이

개념 주 대상 실행 시점 구조
Observer 패턴 코드 내부 객체 즉시, 동기적으로 직접 참조
Event Listener UI/이벤트 객체 이벤트 발생 시 콜백 함수 등록
Pub/Sub 마이크로서비스, 분산 시스템 비동기, 메시지 중계 중간 브로커 사용

✅ 장점

  • 느슨한 결합 (Low Coupling)
  • 상태 변화 감지 자동화
  • 이벤트 기반 흐름 제어 가능

⚠️ 단점

  • 디버깅 어려움 (특히 Pub/Sub)
  • 상태 추적 어려움 (누가 누구를 구독하는지 명확하지 않으면)
  • 너무 많이 연결하면 이벤트 지옥(Event Hell) 발생 가능

📌  요약

Observer 패턴은 객체 간 상태 변화 감지,
Pub/Sub은 시스템 간 메시지 전달,
Event Listener는 이벤트에 대한 콜백 등록.

728x90