
리액티브 프로그래밍을 이해하기 위해 반드시 짚고 넘어가야 할 개념이 바로 리액티브 스트림즈(Reactive Streams) 이다. 이는 리액티브 라이브러리를 구현할 때 따라야 할 표준 인터페이스 사양으로, 비동기 스트림에서 데이터의 흐름을 제어하고, Back Pressure를 통해 구독자가 처리 가능한 만큼만 데이터를 전달받을 수 있도록 보장해준다.
public interface Publisher<T> {
void subscribe(Subscriber<? super T> s);
}
subscribe()를 호출함으로써 구독을 시작한다.public interface Subscriber<T> {
void onSubscribe(Subscription s);
void onNext(T t);
void onError(Throwable t);
void onComplete();
}
request(n)을 통해 Publisher에게 받을 데이터 개수를 명시하며, onNext, onError, onComplete를 통해 데이터를 수신하거나 흐름 종료를 감지한다.public interface Subscription {
void request(long n);
void cancel();
}
public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
}
onNext()로 데이터를 전달해야 하며, 이후에는 onComplete() 또는 onError()로 끝나야 한다.request(n)을 호출해 수신할 데이터 수를 명확히 요청해야 한다.cancel() 이후에는 전송을 중단한다.| 라이브러리 | 설명 |
|---|---|
| RxJava | Java 기반 대표적인 리액티브 라이브러리로 Android, 서버 모두에서 사용됨 |
| Project Reactor | Spring WebFlux 기반 라이브러리. Flux, Mono 제공 |
| Akka Streams | 대규모 데이터 흐름에 적합한 고급 리액티브 스트림 구현체 |
| Java Flow API | Java 9에서 공식 도입된 리액티브 스트림 인터페이스 |
리액티브 스트림즈는 단순히 비동기 흐름을 구성하는 것에 그치지 않고, 데이터 흐름의 압력을 제어하고, 시스템 전체의 안정성을 확보할 수 있는 강력한 기초 도구이다. 실제 프로젝트에서 Reactor나 RxJava를 사용할 때 내부에서 이러한 인터페이스와 흐름 제어가 어떻게 작동하는지 이해하고 있다면, 성능 튜닝과 문제 디버깅에 훨씬 더 능동적으로 대응할 수 있다.