forked from MinePing/Final
-
Notifications
You must be signed in to change notification settings - Fork 0
pattern observer
qbsb147 edited this page Mar 21, 2026
·
1 revision
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
- 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: 메시지 도착
💡 설명:
- ChatService가 주체(Subject) 역할
- WebSocket 세션들이 관찰자(Observer) 역할
- 메시지 수신 시 모든 구독자에게 실시간 알림 전송 → Observer 패턴 적용
- 상태 변경 시 구독자에게 자동 전파
- WebSocket 브로드캐스트 구조에 적합
- 구독자 추가/제거가 용이 → 확장성 좋음