Observer pattern VS Pub-Sub pattern

성유진·2024년 7월 28일

Observer Pattern (관찰자 패턴)

구성 요소

🎊 Subject(주체)

자신의 상태 변경 사항을 Observer들에게 알리는 대상 이다.
즉, 이벤트를 발생시키는 주체라는 의미로 subject라고 한다

+) Observable? Subject?
observer pattern에 대해서 찾아보니 observerble이라는 용어로 설명하는 자료들도 있고, subject라는 용어로 설명하는 자료들이 있어서 혼란스러웠다.
두 가지 모두 상태 변화를 나타내는 주체를 의미하는 것은 같지만
Observable은 특정 언어에서 구체적인 구현을 의미하는 경항이 있고,
Subject는 디자인 패턴을 설명할 때 일반적으로 사용하는 경향이 있다고 한다.

👀 Observer (관찰자)

subject를 구독하여 subject의 상태 변화를 기다리는 대상 이다.
observer는 subject를 구독 등록 및 해지할 수 있다.

동작 방식

그래서 subject와 observer가 실제로 어떻게 동작하는 것인지 살펴보자.
취업을 하고 싶어하는 취준생, 그리고 어떤 회사 A기업이 있다.
취준생은 A기업이 구인을 시작한다는 상태로 변경되기를 기다리고 있을 것이다.
즉, 취준생이 observer, A기업이 subject인 상황이다.
A기업이 구인을 시작한다는 사실을 듣고 싶은 취준생들은 A기업을 구독할 수 있다.

이 때 A기업은 이 취준생들의 목록을 가지고 있어서 사람이 구해야하는 상태로 변경된다면,
취준생들에게 새로운 사람을 뽑는다는 메일을 보내는 이벤트를 발생시킬 수 있게 되는 것이다!

실제 사용 예시

MVC 패턴에서 Model과 View의 관계

Model이 변경되면 해당 Model 정보를 활용하는 모든 View가 변경되어야 한다. 이 때, 보통 observer 패턴이 사용된다.

Publisher-Subscriber Pattern (발행-구독 패턴)

Observer패턴에서 가운데 관리자가 생긴 패턴이다.

구성 요소

📢 Publisher (발행자)

상태 변경 사항을 Broker에게 알린다. 즉, 이벤트를 발행한다.
observer 패턴에서는 상태가 변경되면, 자신을 구독하는 모든 observer들에게 해당 상태가 변함에 따른 이벤트를 직접 발생시켰었다.
하지만 pub-sub패턴에서는 Broker에게 이를 알리고 subscriber에게 이벤트를 실행시키는 일을 맡긴다.

👀 Subscriber (구독자)

Broker에게 구독 발행 및 취소를 요청한다.
Publisher의 상태가 변경되면, Broker가 실행시킨 이벤트를 받게 된다.

🔀 Broker

Publisher가 발행하는 이벤트의 정보들을 관리한다.
Subscriber의 구독 여부를 관리한다.
Publisher가 이벤트를 발행하면 해당 이벤트에 따라서 subscriber에게 이벤트를 실행시킨다.
주로 메시지 큐를 사용하여 동작한다. -> 주로 비동기적으로 동작한다

동작 방식

Observer 패턴에서 보았던 취준생과 기업 예시를 pub-sub 패턴으로 바꾸어서 어떻게 동작하는지 살펴보자.
A기업이 취준생 목록을 관리하는 것이 귀찮아져서
사람을 구하고 싶으면 대신 해당 메일을 발송해주는 매니저회사에 일을 맡겼다고 가정하자.
이때, A기업이 Publisher, 취준생이 Subscriber, 매니저회사가 Broker가 되는 것이다.
A기업은 사람이 필요하면 취준생들에게 메일을 보내고 싶어한다.
근데 이제 직접 메일을 보내는 것이 아니라 매니저 회사에 대신 일을 맡긴다.
매니저회사에 우리가 사람 필요하다고 말하면 우리 A기업을 구독한 취준생들에게 메일 좀 보내줘! 라고 이벤트를 등록해놓는 것이다.
그리고 이제 A회사에 취업하고 싶은 취준생들은 A기업에 직접 요청하는 것이아니라 매니저 기업에 신청 및 취소를 하는 것이다.
매니저 기업이 이제 A기업을 구독하는 취준생 목록과 A기업이 발행하는 이벤트 목록을 모두 가지고 관리를 하는 방식으로 동작한다.

Observer pattern과 Pub-Sub pattern의 차이

둘의 가장 큰 차이점은 이벤트를 발행하는 주체가 구독자들에 대한 정보를 알고 있는지의 여부이다.
observer 패턴에서의 subject는 publisher와 broker의 역할을 모두 한다고 볼 수 있다.
하지만, pub-sub 패턴에서는 publisher가 subscriber에 대한 정보를 전혀 알지 못한 상태로 동작한다.
따라서 pub-sub 패턴이 각 객체끼리 매우 낮은 결합도를 유지하면서 동작한다는 것을 알 수 있다.

Ref.

0개의 댓글