
Observer패턴은 어떤 객체의 상태가 변하면(이벤트 발생) 이를 의존하고 있는 다른 객체들에게 알림을 전달하는 패턴입니다.
예를 들어, 뉴스 구독 시스템이 있습니다. 뉴스가 신규 발행되면 사용자에게 알림 메시지를 전송하는 시스템 입니다.
Subject는 자신을 구독한 Observer를 직접 알고 있습니다. 이벤트가 발생하면 직접 Observer를 호출하여 알림을 보냅니다. 이 구조는 강한 결합(tightly coupled) 관계입니다.
하지만, Subject는 Observer에게 알림만 보낼 뿐, Subject는 그 내부 동작에는 관심이 없습니다. 즉, 동기적으로 알림을 보내고 로직은 Observer에 위임합니다.
Observer 패턴의 예시로 프론트엔드에서 버튼 클릭 이벤트가 대표적입니다. 버튼은 Subject, 콜백함수는 Observer 역할을 합니다. 이처럼 Observer 패턴은 주로 단일 애플리케이션 내에서 동기적으로 작동합니다.
Pub-Sub 패턴은 생산자(Publisher)와 소비자(Subscriber) 사이에 중개자를 두는 구조입니다. Publisher는 메시지를 직접 Subscriber에게 보내지 않고, 중개자에게 발행(publish) 합니다.Subscriber는 중개자로부터 메시지를 수신(subscribe)하는 구조입니다.
이 구조에서 중개자 덕분에 Publisher와 Subscriber는 서로의 존재를 알지 못합니다. 느슨한 결합도(loose coupling)를 가지며 시스템의 확장성이 좋아 Publisher, Subscriber가 늘어나도 문제될 것이 없습니다.
RabbitMQ,Kafka와 같은 메시지 브로커가 이 구조를 따릅니다. MSA환경의 Kafka에서 한 서버가 이벤트를 발행하면 다른 서버는 이벤트를 구독하여 처리합니다. 이때 서버 간에 직접적인 연결은 없습니다. Pub-Sub는 발행자, 구독자간 서로 존재를 알지 못하므로 주로 비동기로 동작합니다.
Observer 패턴과 Pub-Sub 패턴은 이벤트 기반 아키텍쳐를 설계할 때 많이 사용됩니다. 하지만, 결합도와 동작 방식이 다르기 때문에 선호하는 상황 역시 다릅니다. 내부 모듈 간 통신에는 Observer, 서로 다른 모듈 간 독립성과 확장성이 중요한 시스템에는 Pub-Sub 구조를 사용하는 것이 좋습니다.