4.리액티브 스트림 인터페이스
이처럼 리액티브 스트림은 논블로킹의 배압(Back pressure)을 통한 비동기적인 스트림 처리 기능을 제공하는 것이 목적으로, 이를 활용하기 위해서는 다음의 의존성에 대한 설치가 필요
<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) 메서드가 선언되어 있음
package org.reactivestreams;
public interface Publisher<T> {
void subscribe(Subscriber<? super T> var1);
}1-2. 구독자, Subscriber
구독자는 구독 신청을 완료하면 발행자로부터 이벤트를 수신할 수 있음
이 이벤트들은 Subscriber 인터페이스의 메서드들을 통해 전달됨
발행자가 구독자의 onSubscribe()를 호출할 때 구독을 관리하는 객체인 Subscription을 구독자에게 전달
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)을 코드 레벨에서 적용할 수 있는 포인트
배압
구독자가 처리할 수 있는 데이터의 양보다 더 많은 데이터를 발행자가 전송하는 것을 막아주는 역할
요청된 수의 데이터를 발행자로부터 전송 받은 후에 구독자는 다시 request()를 호출하여 더 많은 요청을 수행할 수 있음
또한 더 이상 데이터를 수신받지 않고 싶을 때는 cancel()을 통해 구독을 취소할 수 있음
package org.reactivestreams;
public interface Subscription {
void request(long var1);
void cancel();
}