이 게임을 해본 사람은 알 것이다. 옵저버가 있으면 상대 플레이어를 실시간으로 볼 수 있다.
이를 통해, 우리는 상대방의 행동이나 전략에 따라 유동적으로 반응할 수 있다. 이게 디자인 패턴으로 존재할 때, 어떤 느낌인지 보자.
Source Code : https://github.com/JangAJang/cs/tree/main/src/design/observer
옵저버 패턴이란?
계속해서 변하는 객체가 있다고 해보자.
옵저버들이 해당 객체에 연결되어, 객체의 변경을 감지에, 이에 따른 결과를 가져오게 한다.
예시를 생각하자면, 채팅 기능을 생각해보면 될 것 같다.
채팅방이라는 객체와 채팅방에 참여하는 사용자(옵저버)들이 존재할 때,
채팅방에 누군가 글을 올리면, 모든 사람들이 이에 대한 변경을 감지해 글을 가져오는 방식이다.
자바로 만들어보자.
사실 옵저버 패턴은 주변에서 공부해본 적도, 들어본 적도 없는 구조이다.
그렇기 때문에, 책에 있는 예제와 직접 만들 예제를 다 만들어보았다.
책에서는 Subject, Observer라는 인터페이스를 만들었다.
Subject는 변화하는 객체를, Observer는 해당 객체의 옵저버 역할을 수행하는 인터페이스이다.
이를 실질적으로 수행하는 클래스로 구현해야 한다.
이 때, Subject에서 Observer를 리스트로 저장해, 변화가 있을 때 옵저버들에게 업데이트를 수행하게 한 식이었다.
이를 곱씹어보며, 나만의 예시를 만들었다.
채팅방을 만들어, 사람들이 채팅방의 변화가 있을 때, 이를 감지하는 방식으로 구현을 해보았다.
사람들이 채팅방에 들어간다.
사람들을 채팅방의 변화를 감지해 이를 받아온다(Observer)
채팅방을 옵저버들에 의해 변경을 감지받아 이를 받아온다(Subject)
이를 Room, Reader라는 실제 기능에 맞는 이름으로 명시해두었다.
message added :: a : hi I am A (2023-05-09)
a got messages
a : hi I am A (2023-05-09)
b got messages
a : hi I am A (2023-05-09)
c got messages
a : hi I am A (2023-05-09)
message added :: b : hi I am B (2023-05-09)
a got messages
a : hi I am A (2023-05-09)
b : hi I am B (2023-05-09)
b got messages
a : hi I am A (2023-05-09)
b : hi I am B (2023-05-09)
c got messages
a : hi I am A (2023-05-09)
b : hi I am B (2023-05-09)
message added :: c : hi I am C (2023-05-09)
a got messages
a : hi I am A (2023-05-09)
b : hi I am B (2023-05-09)
c : hi I am C (2023-05-09)
이런식으로 메시지가 각자에게 맞게 업데이트되었고, 이를 확인하기 위해 출력해보았다.
실제 옵저버 패턴을 가장 쉽게 접하는 경우가 WebFlux를 쓸 때 인 것 같다.
현재 캡스톤 디자인에서 채팅서버를 만들어보려고 하는데, 이 때 Publisher, Subscriber의 방식으로 동작하는데, 이것이 옵저버 패턴과 동일하다는 느낌을 받았다.
개인적인 느낌
이러한 패턴의 개발을 해본적이 있었나 싶다가 첫 번째 느낌이었다.
실시간으로 변화하는 값들에 대한 반응을 아직까지 개발에 녹여본 적이 없었는데, 조금 더 심도있게 공부해봐야겠다는 느낌을 받았다.
또한, 실제 WebFlux를 이번 기회로 찍먹에서 이제 담가먹을 정도는 해보려고했는데, 이 발행/구독 방식이 생각보다 어려웠다.
우리가 리포지토리에서 불러오는 데이터가 구독의 방식으로 오다보니, 이를 꺼내서 활용하는데에 생각보다 어려움이 있는 것 같다.
WebFlux도 공부해서 블로그에 올릴 정도로 해봐야겠다.
그럼...twenty thousand...🔥
'CS' 카테고리의 다른 글
[CS] 디자인 패턴 - 전략 패턴 (0) | 2023.04.30 |
---|---|
[CS] 디자인 패턴 - 팩토리 (0) | 2023.04.21 |
[CS] 디자인 패턴 - 싱글톤 (0) | 2023.04.21 |