리액티브 스트림즈(Reactive Streams)란?

grapefruit·2022년 11월 29일
0

BE 2022-11.28~12.02

목록 보기
2/2

JPA(Java Persistence API)는 Java 진영에서 사용하는 ORM(Object-Relational Mapping) 기술의 표준 사양(또는 명세, Specification)입니다.

그리고 JDBC는 Java 애플리케이션에서 데이터베이스에 액세스하기 위한 표준 사양(또는 명세, Specification)이다.

👨🏻‍💻리액티브 스트림즈(Reactive Streams)란?

리액티브 스트림즈(Reactive Streams)는 리액티브 프로그래밍을 위한 표준 사양(또는 명세, Specification)이다.

Java에서는 어떤 기술의 표준 사양을 코드로 정의할 경우 일반적으로 Java의 인터페이스(interface)로 정의한다.

👨🏻‍💻리액티브 스트림즈 컴포넌트

✔ Publisher

1      public interface Publisher<T> {
2         public void subscribe(Subscriber<? super T> s);
3      }

👨🏻‍💻Publisher 인터페이스

Publisher 인터페이스는 데이터 소스로 부터 데이터를 내보내는(emit) 역할을 한다.

Publisher 인터페이스는 위 코드와 같이 subscribe() 추상 메서드를 포함하고 있으며, subscribe()의 파라미터로 전달되는 Subscriber가 Publisher로부터 내보내진 데이터를 소비하는 역할을 한다.

subscribe()는 메서드 이름에서도 알 수 있듯이 Publisher가 내보내는 데이터를 수신할 지 여부를 결정하는 구독의 의미를 가지고 있으며, 일반적으로 subscribe()가 호출되지 않으면 Publisher가 데이터를 내보내는 프로세스는 시작되지 않는다.


✔ Subscriber

1     public interface Subscriber<T> {
2         public void onSubscribe(Subscription s);
3         public void onNext(T t);
4         public void onError(Throwable t);
5         public void onComplete();
6     }

👨🏻‍💻Subscriber 인터페이스

Subscriber 인터페이스Publisher로부터 내보내진 데이터를 소비하는 역할을 한다.

Subscriber는 네 개의 추상 메서드를 포함하고 있으며, 각 메서드의 역할은 다음과 같습니다.

  • onSubscribe(Subscription s)

    구독이 시작되는 시점에 호출되며, onSubscribe() 내에서 Publisher에게 요청할 데이터의 개수를 지정하거나 구독 해지 처리를 할 수 있다.

  • onNext(T t)

    Publisher가 데이터를 emit할 때 호출되며, emit된 데이터를 전달 받아서 소비할 수 있다.

  • onError(Throwable t)

    Publisher로부터 emit된 데이터가 Subscriber에게 전달되는 과정에서 에러가 발생할 경우에 호출된다.

  • onComplete()

    Publisher가 데이터를 emit하는 과정이 종료될 경우 호출되며, 데이터의 emit이 정상적으로 완료 된 후, 처리해야 될 작업이 있다면 onComplete() 내에서 수행할 수 있다.


✔ Subscription

1     public interface Subscription {
2        public void request(long n);
3        public void cancel();
4  }

👨🏻‍💻Subscription 인터페이스

Subscription 인터페이스는 Subscriber의 구독 자체를 표현한 인터페이스이며, 각 메서드의 역할은 다음과 같다.

  • request(long n)

    Publihser가 emit하는 데이터의 개수를 요청한다.

  • cancel()

    구독을 해지하는 역할을 한다.
    즉, 구독 해지가 발생하면 Publisher는 더이상 데이터를 emit하지 않는다.


✔ Processor

1    public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
2     }

👨🏻‍💻Processor 인터페이스

Processor 인터페이스는 Subscriber 인터페이스와 Publisher 인터페이스를 상속하고 있기 때문에 Publisher와 Subscriber의 역할을 동시에 할 수 있는 특징을 가지고 있으며, 별도로 구현해야 되는 추상 메서드는 없다.


👨🏻‍💻리액티브 스트림즈의 구현체

리액티브 스트림즈가 리액티브 프로그래밍을 위한 사양이니, 분명히 사양에 맞게 구현된 구현체가 존재할 것이다.

  • Project Reactor

    Project Reactor(줄여서 Reactor)는 리액티브 스트림즈를 구현한 대표적인 구현체로써 Spring과 궁합이 가장 잘 맞는 리액티브 스트림즈 구현체이며, 우리가 다음 유닛에서 학습하게 될 리액티브 스트림즈의 구현체이기도 하다.

Reactor는 Spring 5의 리액티브 스택에 포함되어 있으며 Sprig Reactive Application 구현에 있어 핵심적인 역할을 담당하고 있다.

  • RxJava

    RxJava는 .NET 기반의 리액티브 라이브러리를 넷플릭스에서 Java 언어로 포팅한 JVM 기반의 리액티브 확장 라이브러리다.

RxJava의 경우 2.0부터 리액티브 스트림즈 표준 사양을 준수하고 있으며, 이 전 버전의 컴포넌트와 함께 혼용되어 사용이 되고 있다.

  • Java Flow API

    Java 역시 Java 9부터 리액티브 스트림즈를 지원하고 있다.
    그런데 Flow API는 리액티브 스트림즈를 구현한 구현체가 아니라 리액티브 스트림즈 표준 사양을 Java 안에 포함을 시킨 구조라고 볼 수 있다.

즉, 다양한 벤더들이 JDBC API를 구현한 드라이버를 제공할 수 있도록 SPI(Service Provider Interface) 역할을 하는것 처럼 Flow API 역시 리액티브 스트림즈 사양을 구현한 여러 구현체들에 대한 SPI 역할을 한다고 보면 될 것 같다.

  • 기타 리액티브 확장(Reactive Extension)

    RxJava의 Rx는 Reactive Extension의 줄임말이다.

이 의미는 특정 언어에서 리액티브 스트림즈를 구현한 별도의 구현체가 존재한다는 의미이며, 실제로 다양한 프로그래밍 언어에서 리액티브 스트림즈를 구현한 리액티브 확장(Reactive Extension) 라이브러리를 제공하고 있다.

대표적인 리액티브 확장(Reactive Extension) 라이브러리로 앞에서 언급한 RxJava가 있으며, 이외에도 RxJS, RxAndroid, RxKotlin, RxPython, RxScala 등이 있다.

profile
개발자몽

0개의 댓글