Skip to Content
Suffering builds character
아카이브23.스프링 웹플럭스Spring WebFlux4.리액티브 스트림 인터페이스

4.리액티브 스트림 인터페이스

이처럼 리액티브 스트림은 논블로킹의 배압(Back pressure)을 통한 비동기적인 스트림 처리 기능을 제공하는 것이 목적으로, 이를 활용하기 위해서는 다음의 의존성에 대한 설치가 필요

pom.xml
<dependency> <groupId>org.reactivestreams</groupId> <artifactId>reactive-streams</artifactId> <version>1.0.4</version> </dependency>

1. 리액티브 스트림 인터페이스

리액티브 스트림은 대표적으로 3~4개 인터페이스를 정의하고 있음
→ Processor는 생략, Project Reactor 모듈에서 Deprecated됨(3.xx 버전 이후)

1-1. 발행자, Publisher

하나의 구독(Subscription)당 한명의 구독자(Subscriber)에게 발행, 전송할 데이터를 생성하는 역할

따라서 Publisher 인터페이스에는 구독자가 발행자를 구독 신청할 수 있는 subscribe(Subscriber) 메서드가 선언되어 있음

Publisher.java
package org.reactivestreams; public interface Publisher<T> { void subscribe(Subscriber<? super T> var1); }

1-2. 구독자, Subscriber

구독자는 구독 신청을 완료하면 발행자로부터 이벤트를 수신할 수 있음
이 이벤트들은 Subscriber 인터페이스의 메서드들을 통해 전달됨

발행자가 구독자의 onSubscribe()를 호출할 때 구독을 관리하는 객체인 Subscription을 구독자에게 전달

Subscriber.java
package org.reactivestreams; public interface Subscriber<T> { void onSubscribe(Subscription var1); void onNext(T var1); void onError(Throwable var1); void onComplete(); }

구독자의 데이터 요청이 완료되면 데이터가 스트림을 통해 전달되기 시작하며, onNext()가 호출되어 발행자가 전송하는 데이터가 구독자에게 전달 됨

에러가 발생하였을 경우에는 onError()가 호출되며, 발행자로부터 더 이상 전송 받을 데이터가 없고, 더 이상 데이터를 생성하지 않을 경우에는 발행자가 onComplete()을 호출하여 작업이 끝났다고 구독자에게 통지함

1-3. 구독, Subscription

구독자는 Subscription 객체를 통해 자신의 구독 상태를 관리할 수 있음

구독자는 request()를 호출하여 자신이 전송 받을 수 있는 데이터의 개수 만큼만 받을 수 있고,
→ 배압(Back Pressure)을 코드 레벨에서 적용할 수 있는 포인트

Note

배압

구독자가 처리할 수 있는 데이터의 양보다 더 많은 데이터를 발행자가 전송하는 것을 막아주는 역할

요청된 수의 데이터를 발행자로부터 전송 받은 후에 구독자는 다시 request()를 호출하여 더 많은 요청을 수행할 수 있음

또한 더 이상 데이터를 수신받지 않고 싶을 때는 cancel()을 통해 구독을 취소할 수 있음

Subscription.java
package org.reactivestreams; public interface Subscription { void request(long var1); void cancel(); }
Last updated on