Spring/WebFlux
[Spring WebFlux] Publisher과 Subscriber
alska95
2024. 2. 20. 19:58
Publisher는 리액티브 프로그래밍에서 데이터 스트림을 생성하고 발행하는 주체다.
Reactive Streams 사양에서는 Publisher 인터페이스를 정의하며, 이는 데이터를 생성하고 구독자(Subscriber)에게 데이터를 전달하는 메커니즘을 가진다.
Publisher의 주요 특징은 다음과 같다
- 비동기 데이터 스트림: Publisher는 비동기적으로 데이터 아이템을 발행한다. 이는 데이터를 생성하고 처리하는 작업이 호출자의 스레드와 다른 스레드에서 발생할 수 있음을 의미한다.
- 백프레셔(backpressure) 지원: Publisher는 구독자가 처리할 수 있는 데이터의 양을 제어할 수 있는 백프레셔 메커니즘을 지원한다. 구독자는 request(n) 메서드를 통해 한 번에 처리할 아이템의 수를 요청할 수 있다.
- 구독자와의 상호작용: Publisher는 하나 이상의 구독자와 상호작용할 수 있으며, 각 구독자는 subscribe 메서드를 호출하여 데이터 스트림을 구독한다.
Publisher의 구현 예로는 Flux와 Mono가 있다. 이들은 Project Reactor에서 제공하는 Publisher의 구현체로, 다음과 같은 특징을 가진다
- Flux: 0개 이상의 데이터 아이템을 발행할 수 있는 Publisher다. 여러 값의 스트림을 처리할 때 사용된다.
- Mono: 0개 또는 1개의 데이터 아이템을 발행할 수 있는 Publisher다. 단일 값 또는 비동기 작업의 결과를 나타낼 때 사용된다.
Subscriber는 리액티브 프로그래밍에서 Publisher가 발행하는 데이터 스트림을 수신하는 구성 요소다.
Reactive Streams 사양에서 Subscriber 인터페이스는 데이터 스트림을 소비하는 방법을 정의하며, Publisher와 상호 작용하여 데이터를 받고 처리하는 메커니즘을 가진다.
Subscriber의 주요 특징은 다음과 같다
- 데이터 수신: Subscriber는 Publisher로부터 데이터 아이템을 수신한다. Publisher로부터 데이터를 받을 준비가 되면 Subscriber는 request(n) 메서드를 호출하여 원하는 만큼의 데이터를 요청할 수 있다.
- 백프레셔(backpressure) 구현: Subscriber는 request(n) 메서드를 통해 백프레셔를 구현한다. 이를 통해 Subscriber는 자신의 처리 능력에 맞춰 데이터를 요청하고, Publisher의 데이터 발행 속도를 제어한다.
- 라이프사이클 콜백: Subscriber 인터페이스는 스트림의 라이프사이클과 관련된 여러 콜백 메서드를 정의한다. 대표적으로 onSubscribe(Subscription s), onNext(T t), onError(Throwable t), onComplete() 메서드가 있다.
Subscriber의 라이프사이클 콜백 메서드는 다음과 같은 역할을 한다
- onSubscribe(Subscription s): Subscriber가 Publisher에 구독할 때 호출된다. Subscription 객체를 통해 Subscriber는 데이터 요청 및 구독 취소 등의 작업을 할 수 있다.
- onNext(T t): Publisher로부터 새로운 데이터 아이템을 수신할 때마다 호출된다. Subscriber는 이 메서드를 통해 데이터를 처리한다.
- onError(Throwable t): 데이터 처리 중 오류가 발생했을 때 호출된다. 이 메서드가 호출되면 스트림은 더 이상 데이터를 발행하지 않으며, Subscriber는 오류를 처리한다.
- onComplete(): 데이터 스트림이 성공적으로 완료되었을 때 호출된다. 모든 데이터가 처리되고 더 이상 수신할 데이터가 없음을 의미한다.
Subscriber는 리액티브 시스템에서 데이터를 처리하는 핵심적인 역할을 담당하며, Publisher와의 상호 작용을 통해 비동기적이고 논블로킹 방식으로 데이터 스트림을 소비한다.