본문 바로가기

개발 공부

Pub/Sub (1)

Pub/Sub 란?

메시징 시스템에서의 기본 개념

Pub/Sub은 Publish / Subscribe의 줄임말로, 메시지를 발행(Publish) 하는 주체와 이를 구독(Subscribe) 하는 주체가 직접 연결되지 않고도 메시지를 주고받을 수 있는 비동기 메시징 패턴입니다.

 

 

즉, 발행자는 “이런 일이 일어났어!” 라고 외치고, 구독자는 “이런 일이 일어나면 알려줘!” 하고 기다리는 구조입니다.

 

  • Publisher (발행자)
    • 메시지를 보내는 주체입니다.
    • 예: "새로운 상품이 입고되었어요!" 라고 시스템에 알리는 역할
  • Subscriber (구독자)
    • 특정 주제를 구독하고 있다가 메시지를 수신하는 주체입니다.
    • 예: “새 상품 소식이 오면 알림을 받고 싶어요!” 라고 기다리는 사용자 또는 시스템

이 사이를 중재하는 중앙 허브(브로커 또는 메시지 큐)가 존재하여, 발행자와 구독자는 서로에 대해 아무것도 몰라도 됩니다.

 

 

 


 

구조 예시 (다이어그램 설명)

[Publisher] → 메시지 발행 → [Broker] → 메시지 전달 → [Subscriber 1]
                                              ↘︎            [Subscriber 2]
 
  • Publisher는 “topic = 신상품알림”이라는 주제로 메시지를 발행합니다.
  • Broker는 “topic = 신상품알림”을 구독한 Subscriber들에게 해당 메시지를 전달합니다.
  • Publisher는 Subscriber가 몇 명인지, 누구인지 전혀 알지 못합니다. → 느슨한 결합

 


 

Observer 패턴과의 관계

Pub/Sub은 흔히 Observer 패턴의 확장판이라고 이해하면 좋습니다.

  • Observer 패턴
    • 객체 간의 1:N 관계. 한 객체의 상태 변화에 따라 여러 객체가 자동으로 반응함.
  • Pub/Sub 모델
    • 이 구조를 네트워크/시스템 전반으로 확장한 버전.
    • 차이점은 이벤트 브로커라는 중간자가 있다는 점
    • 직접적인 참조 없이, 전역 이벤트 시스템처럼 느슨하게 통신

 


 

Pub/Sub 모델이 필요한 이유

 

1) 느슨한 결합 (Loose Coupling)

 

프로그래밍에서 느슨한 결합은 시스템 설계에서 매우 중요한 가치입니다.

  • Publisher는 Subscriber가 존재하는지 여부조차 모름
  • Subscriber는 Publisher가 어떻게 메시지를 보내는지도 모름
  • 중간에 브로커만 존재

 

이런 구조 덕분에 각 컴포넌트가 독립적으로 설계/배포/확장될 수 있습니다.

 

예시

// Angular 예시 (RxJS Subject)
const notifier = new Subject<string>();

// 구독자
notifier.subscribe(msg => console.log('구독한 메시지:', msg));

// 발행자
notifier.next('새로운 유저가 가입했습니다.');

 


 

2) 실시간성 (Real-time)

 

Pub/Sub은 이벤트가 발생하자마자 구독자에게 즉시 전달됩니다.

  • 실시간 채팅
  • 실시간 알림
  • 스트리밍 시스템

같은 기능에서 필수적인 아키텍처입니다.

 

예) 유튜브에서 실시간 댓글 올라오는 기능 → 댓글 발행 시 구독자 브라우저에 실시간 반영

 


3) 이벤트 기반 아키텍처의 핵심

이벤트 기반(Event-driven) 아키텍처는 말 그대로 “무언가가 일어나면, 그에 반응한다”는 구조입니다.

 

이 구조에서 Pub/Sub은 가장 중요한 메시징 방식이에요.

  • 사용자 행동 (클릭, 입력 등)
  • 백엔드 작업 완료 (결제 완료, 상품 등록 등)
  • 센서 데이터 수신 (IoT 등)

모든 게 이벤트로 추상화되며, 그 이벤트를 발행하고 구독하는 구조로 설계하면 유지보수와 확장성이 훨씬 좋아집니다.

 


4) 마이크로서비스와의 궁합

마이크로서비스 아키텍처는 각 서비스가 독립적으로 배포되고 실행되어야 합니다.

그런데 서로 직접 호출하게 되면 결합도가 올라갑니다.

 

그래서 대안으로 등장한 것이 바로 Pub/Sub입니다.

  • Order Service가 “주문 생성됨” 이벤트를 발행
  • Inventory Service는 이를 구독해서 재고를 감소
  • Notification Service는 이를 구독해서 이메일 발송

각 서비스는 서로를 호출하지 않고, 오직 이벤트만 주고받는 구조 → 유연성, 확장성, 장애 전파 최소화

 


 

요약

 

항목 설명
핵심 개념 발행자와 구독자가 직접 연결되지 않고 중간 브로커를 통해 메시지를 주고받음
구성 요소 Publisher, Subscriber, Broker
장점 느슨한 결합, 실시간성, 이벤트 기반 아키텍처 구현에 적합
실사용 예 Angular RxJS, Redis Pub/Sub, Kafka, GCP Pub/Sub 등
적합한 상황 마이크로서비스, 실시간 알림, IoT, 대규모 메시징

 

 

'개발 공부' 카테고리의 다른 글

Pub/Sub (3) - Next.js + Zustand  (0) 2025.06.30
Pub/Sub (2) - Angular + RxJS  (0) 2025.06.29
Node.js, Redis  (0) 2025.06.25
트랜잭션(Transaction)  (0) 2025.06.19
MCP (Model Context Protocol) (3)  (1) 2025.06.17