Skip to content

pattern observer

qbsb147 edited this page Mar 21, 2026 · 1 revision

🧩 Observer 패턴

📌 목적

Observer 패턴은 객체의 상태 변화를 관찰자(Observer) ``들에게 자동으로 통보하는 디자인 패턴입니다.

  • 주체(Subject): 상태를 가지고 있으며, 변경 시 등록된 Observer들에게 알림
  • 관찰자(Observer): 주체의 상태 변화를 감지하고 필요한 처리를 수행

💡 WebSocket 브로드캐스트 예시:
Consumer가 메시지를 수신하면, **구독하고 있는 클라이언트(WebSocket Session)**에 메시지를 전송하는 구조가 Observer 패턴을 적용한 사례입니다.

🔹 구조

classDiagram
    %% 관찰 대상자 인터페이스
    class ISubject {
        +registerObserver()
        +removeObserver()
        +notifyObservers()
    }

    %% 구체적 관찰 대상자
    class ConcreteSubject {
        -observers : List~IObserver~  %% 관찰자들을 리스트로 가짐
        +registerObserver()
        +removeObserver()
        +notifyObservers()
    }

    %% 관찰자 인터페이스
    class IObserver {
        +update()
    }

    %% 구체적 관찰자
    class ObserverA {
        +update()
    }

    class ObserverB {
        +update()
    }

    %% 관계 정의
    ISubject <|-- ConcreteSubject
    IObserver <|-- ObserverA
    IObserver <|-- ObserverB
    ConcreteSubject --> IObserver
Loading
  • ISubject : 관찰 대상자를 정의하는 인터페이스
  • ConcreteSubject : 관찰 당하는 대상자 / 발행자 / 게시자
    • Observer들을 리스트(List, Map, Set ..등)로 모아 합성(compositoin)하여 가지고 있음
    • Subject의 역할은 관찰자인 Observer들을 내부 리스트에 등록/삭제 하는 인프라를 갖고 있다. (register, remove)
    • Subject가 상태를 변경하거나 어떤 동작을 실행할때, Observer 들에게 이벤트 알림(notify)을 발행한다.
  • IObserver : 구독자들을 묶는 인터페이스 (다형성)
  • Observer : 관찰자 / 구독자 / 알림 수신자.
    • Observer들은 Subject가 발행한 알림에 대해 현재 상태를 취득한다.
    • Subject의 업데이트에 대해 전후 정보를 처리한다.
@Override
private void send(MessageDto.Request chatMessageDto) throws IOException {
    for (String subscriber : subscribers) {
        UUID subscriberUuid = UUID.fromString(subscriber);
        WebSocketSession subscriberSession = onlineWebSocketHandler.getSession(subscriberUuid);
        if (subscriberSession != null && subscriberSession.isOpen()) {
            subscriberSession.sendMessage(new TextMessage(objectMapper.writeValueAsString(chatMessageDto)));
        }
    }
}

public void handle(MessageDto.Request chatMessageDto) throws IOException {
    // Redis에서 나를 구독하는 사람들을 조회
    // 웹소켓에서 session들을 가져와 해당 메세지를 전송
    send(chatMessageDto);
}

🔹 시퀀스 다이어그램

sequenceDiagram
    participant Consumer
    participant ChatService as Subject
    participant WebSocketSession as Observer

    Consumer->>ChatService: 메시지 수신
    ChatService->>WebSocketSession: 등록된 모든 구독자에게 전송(send)
    WebSocketSession->>User: 메시지 도착
Loading

💡 설명:

  • ChatService가 주체(Subject) 역할
  • WebSocket 세션들이 관찰자(Observer) 역할
  • 메시지 수신 시 모든 구독자에게 실시간 알림 전송 → Observer 패턴 적용

🔹 특징

  • 상태 변경 시 구독자에게 자동 전파
  • WebSocket 브로드캐스트 구조에 적합
  • 구독자 추가/제거가 용이 → 확장성 좋음

📡 이벤트 스트리밍

⚙️ 개발 환경 구축

Websocket

Kafka

Redis

Debezium

🧩 기능 구현

이벤트리스너(Spring)

Pub/Sub 기반 메세지 처리(Redis)

이벤트 스트리밍 처리(Kafka)

CDC(Debezium)

🧠 개념

🎯 설계 패턴

🏗️ 아키텍처

📚 기술 스택

Clone this wiki locally