목차
- 옵저버 패턴(Observer Pattern)이란?
- 발행-구독 패턴(Publisher-Subscriber Pattern)이란?
- 발행-구독 패턴의 장점
- 발행-구독 패턴의 단점
옵저버 패턴(Observer Pattern)이란?
구독자 패턴을 공부하러 왔는데, 왜 옵저버 패턴이 먼저 나오냐구요? 🤔
둘이 유사한 부분이 있어서 비교를 하며 설명하고자 옵저버 패턴을 먼저 간단하게 짚고 넘어가겠습니다 !
가 아니라
옵저버 패턴(Observer Pattern)은 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버드의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메소드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다.
주로 분산 이벤트 핸들링 시스템을 구현하는 데 사용된다.
발행/구독 모델로 알려져 있기도 하다.
라고 합니다. 쉽게 설명하면 이벤트를 발행하는 Subject가 있고, Observer들은 Subject의 옵저버 목록에 등록되어 Subject의 상태 변화가 있을 때마다 각 옵저버들에게 이벤트를 통지하도록 하는 디자인 패턴입니다. UML로 표현해보면 아래와 같습니다.
이미지 출처: 위키피디아
흐름은 다음과 같습니다.
- subject에 observer들을 attach 한다.
- subject의 상태가 바뀐다.
- subject.notify()를 통해 모든 옵저버들을 하나씩 호출한다.
이미지 출처: 위키피디아
발행-구독 패턴(Publisher-Subscriber Pattern)이란?
발행-구독 패턴은 비동기 메시징 패러다임이다. 발행-구독 모델에서 발신자의 메시지는 특별한 수신자가 정해져 있지 않다. 대신 발행된 메시지는 정해진 범주에 따라, 각 범주에 대한 구독을 신청한 수신자에게 전달된다. 수신자는 발행자에 대한 지식이 없어도 원하는 메시지만을 수신할 수 있다. 이러한 발행자와 구독자의 디커플링은 더 다이나믹한 네트워크 토폴로지와 높은 확장성을 허용한다.
발행-구독패턴의 매커니즘은 옵저버 패턴과 유사합니다.
하지만 옵저버 패턴과 발행-구독패턴 사이에 가장 큰 차이점이 있습니다.
발행-구독패턴에선 발행자는 구독자를 모르고, 구독자는 발행자를 모른다는 점인데요.
어떻게 이게 가능할까요?
발행-구독패턴에서 Publisher와 Subscriber 사이에는 브로커(Broker)라는 계층이 존재합니다.
이미지 출처: 마이크로소프트
Publisher는 이벤트가 발생하면 메시지를 브로커에게 보내기만 하면되고 Subscriber는 브로커에게 구독하고 싶은 이벤트를 알려주면, 이벤트가 발생했을 때 해당 이벤트를 구독하고 있는 Subscriber들에게 브로커가 메시지를 보내게 됩니다.
발행-구독 패턴의 장점
낮은 결합도
이렇게 되면 Publisher와 Subscriber는 서로를 모르게 되기 때문에, 옵저버 패턴에 비해 결합도가 낮아지게 됩니다.
접근성
또한 브로커라는 중간 매개체가 있기 때문에, 도메인이 다르더라도 브로커에 접근할 수만 있다면 이벤트를 전달할 수 있다는 점이 장점입니다.
발행-구독 패턴의 단점
복잡성
브로커에서 모든 이벤트에 대한 로직을 처리하기 때문에, 이벤트 구조가 복잡해지면 브로커를 구현하기 힘들뿐더러 로직이 복잡해져 디버깅하기 매우 힘든 구조가 됩니다.
보안
브로커가 잘못된 클라이언트에 알림을 보낼 수 있고, 허락되지 않은 발행자가 잘못되거나 손상된 메시지를 브로커에게 전달할 경우 보안이 취약해 질 수 있습니다.
참고 자료
옵저버 패턴 https://ko.wikipedia.org/wiki/%EC%98%B5%EC%84%9C%EB%B2%84_%ED%8C%A8%ED%84%B4
발행-구독패턴 https://ko.wikipedia.org/wiki/%EB%B0%9C%ED%96%89-%EA%B5%AC%EB%8F%85_%EB%AA%A8%EB%8D%B8
발행-구독패턴2 https://learn.microsoft.com/en-us/azure/architecture/patterns/publisher-subscriber
패턴 비교 정리 글 https://haeng-on.tistory.com/97
'부스트캠프' 카테고리의 다른 글
동시성, 병렬성, 동기(sync), 비동기(async) 개념 정리 (2) | 2024.07.29 |
---|---|
네이버 부스트캠프 웹・모바일 9기 챌린지 과정 2주차 회고 (0) | 2024.07.26 |
함수형 프로그래밍 with. Swift (0) | 2024.07.24 |
Swift 정규표현식 (0) | 2024.07.23 |
Static Dispatch & Dynamic Dispatch (0) | 2024.07.22 |