[Reactive Programming] 2. Reactive Streams

y001·2025년 4월 18일

Reactive Programming

목록 보기
2/30
post-thumbnail

리액티브 프로그래밍을 이해하기 위해 반드시 짚고 넘어가야 할 개념이 바로 리액티브 스트림즈(Reactive Streams) 이다. 이는 리액티브 라이브러리를 구현할 때 따라야 할 표준 인터페이스 사양으로, 비동기 스트림에서 데이터의 흐름을 제어하고, Back Pressure를 통해 구독자가 처리 가능한 만큼만 데이터를 전달받을 수 있도록 보장해준다.


리액티브 스트림즈 구성 요소

1. Publisher

public interface Publisher<T> {
    void subscribe(Subscriber<? super T> s);
}
  • 데이터를 생성하고 구독자에게 발행하는 주체이다.
  • 구독자가 subscribe()를 호출함으로써 구독을 시작한다.

2. Subscriber

public interface Subscriber<T> {
    void onSubscribe(Subscription s);
    void onNext(T t);
    void onError(Throwable t);
    void onComplete();
}
  • 데이터를 요청하고 소비하는 주체이며, 전체 흐름을 제어한다.
  • request(n)을 통해 Publisher에게 받을 데이터 개수를 명시하며, onNext, onError, onComplete를 통해 데이터를 수신하거나 흐름 종료를 감지한다.

3. Subscription

public interface Subscription {
    void request(long n);
    void cancel();
}
  • Publisher와 Subscriber 사이의 계약 객체로, 데이터를 얼마만큼 받을지 요청하고 중단할 수 있다.
  • 구독자가 처리할 수 있는 만큼만 요청하도록 하여, Back Pressure를 구현하는 핵심이다.

4. Processor

public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
}
  • 입력도 받고 출력도 하는 중간 처리자로, Subscriber와 Publisher의 역할을 모두 수행한다.
  • 예: 데이터 필터링, 변환, 버퍼링 등을 처리할 수 있다.

리액티브 스트림즈 규약

  • Publisher는 구독자가 요청한 개수만큼만 onNext()로 데이터를 전달해야 하며, 이후에는 onComplete() 또는 onError()로 끝나야 한다.
  • Subscriberrequest(n)을 호출해 수신할 데이터 수를 명확히 요청해야 한다.
  • Subscription은 요청된 개수만큼만 emit 하며, cancel() 이후에는 전송을 중단한다.
  • Back Pressure를 통해 구독자의 처리 능력을 초과하지 않도록 보장한다.
  • 모든 Signal은 순서를 지키고, 동시성에 안전하게 전송되어야 한다.

리액티브 스트림즈 주요 구현체

라이브러리설명
RxJavaJava 기반 대표적인 리액티브 라이브러리로 Android, 서버 모두에서 사용됨
Project ReactorSpring WebFlux 기반 라이브러리. Flux, Mono 제공
Akka Streams대규모 데이터 흐름에 적합한 고급 리액티브 스트림 구현체
Java Flow APIJava 9에서 공식 도입된 리액티브 스트림 인터페이스

리액티브 스트림즈는 단순히 비동기 흐름을 구성하는 것에 그치지 않고, 데이터 흐름의 압력을 제어하고, 시스템 전체의 안정성을 확보할 수 있는 강력한 기초 도구이다. 실제 프로젝트에서 Reactor나 RxJava를 사용할 때 내부에서 이러한 인터페이스와 흐름 제어가 어떻게 작동하는지 이해하고 있다면, 성능 튜닝과 문제 디버깅에 훨씬 더 능동적으로 대응할 수 있다.

0개의 댓글