Publisher/Subscriber 패턴

Single Ko·2024년 8월 7일
0

reactive-programing

목록 보기
4/8

리액티브 프로그래밍은 데이터의 흐름과 변화에 반응하는 프로그래밍 패러다임입니다.
이 방식은 주로 비동기 처리와 스트림 데이터를 다루는 데 유용합니다. 리액티브 프로그래밍의 핵심 개념은 Publisher/Subscriber 패턴과 관찰자 패턴(Observer Pattern)입니다.

Publisher/Subscriber 패턴

이 패턴은 두 가지 주요 역할을 가진 객체로 구성됩니다: Publisher(발행자)와 Subscriber(구독자).

Publisher는 데이터를 생성하고 발행하는 역할을 합니다. 그리고 Subscriber는 Publisher로부터 데이터를 받기 위해 구독하는 역할을 합니다.

예시:

Publisher: 뉴스를 생산하고 배포하는 신문사 역할을 합니다. 데이터 스트림을 생성하고 발행하는 주체입니다.

Subscriber: 신문을 구독하는 독자 역할을 합니다. Publisher가 발행하는 데이터를 받아 처리하는 주체입니다.

1. 구독 과정:

Subscriber는 Publisher의 subscribe 메소드를 호출하여 구독을 시작합니다.

Publisher는 Subscriber에게 Subscription 객체를 전달합니다. 이 객체를 통해 구독자는 데이터를 요청하거나 구독을 취소할 수 있습니다.

2. 데이터 요청과 전달:

Subscriber는 Subscription 객체를 사용해 Publisher에게 데이터를 요청합니다.

Publisher는 Subscriber의 onNext 메소드를 호출하여 요청된 데이터를 하나씩 전달합니다. 여기서 중요한 점은, Publisher는 구독자가 요청한 만큼의 데이터만 전달합니다.

3. 구독 종료:

Publisher가 더 이상 보낼 데이터가 없을 때는 Subscriber의 onComplete 메소드를 호출하여 구독을 종료합니다.
처리 중 오류가 발생하면 onError 메소드를 호출하여 예외 정보를 전달하고 구독을 종료합니다.

관찰자 패턴 (Observer Pattern)

관찰자 패턴은 Publisher/Subscriber 패턴과 유사하지만, 일반적으로 단일 이벤트의 발생을 관찰하고 반응하는 데 초점을 맞춥니다.

주체 (Subject)는 상태 변화를 알리기 위해 여러 관찰자 (Observer)에게 알림을 보냅니다. 주체는 상태가 변할 때마다 모든 관찰자에게 알립니다.

1. 등록과 해제:

관찰자는 주체에게 자신을 등록하여 알림을 받을 준비를 합니다.
주체는 필요할 때 관찰자를 해제할 수도 있습니다.

2. 알림:

주체의 상태가 변경되면, 모든 등록된 관찰자에게 변경 사항을 알립니다.
관찰자는 주체로부터 받은 알림을 처리합니다.

예시:

주식 시장 (Publisher): 주식 가격 변동을 실시간으로 발행합니다.
투자자 (Subscriber): 특정 주식 가격 변화를 구독하고, 변동에 따라 매수/매도 결정을 내립니다.

리액티브 프로그래밍에서의 활용

리액티브 프로그래밍은 이러한 패턴을 활용하여 데이터 흐름을 효율적으로 관리하고, 비동기 이벤트 처리를 간소화합니다. 예를 들어, 사용자 인터페이스에서 버튼 클릭 이벤트를 처리할 때, 버튼은 Publisher가 되고, 클릭 이벤트를 처리하는 로직은 Subscriber가 될 수 있습니다.

관련 용어:

Upstream (업스트림): 데이터 흐름의 상류, 즉 Publisher를 의미합니다.
Downstream (다운스트림): 데이터 흐름의 하류, 즉 Subscriber를 의미합니다.
Producer (생산자): 데이터를 생산하는 자, 즉 Publisher를 의미합니다.
Consumer (소비자): 데이터를 소비하는 자, 즉 Subscriber를 의미합니다.
Backpressure (백프레셔): Subscriber가 Publisher에게 데이터 전송 속도를 조절하도록 요청하는 메커니즘입니다. 데이터 과부하를 방지하는 데 중요한 역할을 합니다.

마치며..

  • Reactive Programming은 단순히 Publisher/Subscriber 패턴만을 의미하지 않습니다. 비동기 처리, 논블로킹 작업, 데이터 스트림 처리 등 다양한 개념을 포함하는 포괄적인 개념입니다.

  • Backpressure는 리액티브 프로그래밍의 중요한 특징입니다. 데이터 생산 속도와 소비 속도의 불균형을 해소하여 시스템 안정성을 유지하는 데 중요한 역할을 합니다.

profile
공부 정리 블로그

0개의 댓글