본문 바로가기
2023~/스프링으로 시작하는 리액티브 프로그래밍

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

by 경아ㅏ 2024. 8. 28.

 

2.1 리액티브 스트림즈란?

 

데이터를 리액티브하게 처리하기 위해서는 리액티브 라이브러리 필요

리액티브 스트림즈 = 데이터를 리액티브(비동기 Non-Blocking 방식) 하게 처리하기 위한 리액트 라이브러리의 표준 사양

 


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

 

  • Publisher
  • Subscriber
  • Subscription(요청할 데이터 개수 지정, Publisher 구독 취소 등의 역할)
  • Processor(Publisher, Subscriber 동시 역할 가능)

 

1) Subscriber 는 Publisher를 구독

2) Publisher 는 데이터를 통지할 준비가 되었음을 Subscriber에 전달

3) Subscriber 가 데이터 요청 개수 지정하여 요청(Subscription.request)

4) Publisher 가 요청된 데이터만큼 통지(onNext)

5) 3-4 번 반복

6) 완료(OnComplete), 에러(onError)가 발생하면 해당 사실 전달

 

 

2.3 코드로 보는 리액티브 스트림즈 컴포넌트

 

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

 

Publisher.subscribe 를 호출하여 구독할 Subscriber 등록 (kafka와 다르게 Subscriber 를 Publisher 쪽에서 등록한다고 한다)

 

public interface Subscriber<T> {
    public void onSubscribe(Subscription s);
    public void onNext(T t);
    public void onError(Throwable t);
    public void onComplete();
}

public interface Subscription {
    public void request(long n);
    public void cancel();
}

 

 

  • onSubscribe: 구독을 시작할 때 필요한 것들을 처리(Publisher 로 부터 몇 개의 데이터를 요청할 것인지/구독 해지 등)
  • onNext: Publisher 가 데이터를 통지할 때 데이터 처리
  • onError: 데이터 통지 할 때 에러가 발생한 경우에 처리 요청
  • onComplete: Publisher 에서 생성한 데이터를 모두 방출했을 때 처리 요청

 

위의 네 개 메서드는 Publisher 가 호출하는 Subscriber 메서드이므로 Publisher 가 Subscriber 에게 보내는 signal, Subscription 의 request, cancel 메서드는 Subscriber 에서 호출하는 메서드이므로 Subscriber 가 Publisher 에게 보내는 signal

 

 

2.4 리액티브 스트림즈 관련 용어 정의

 

Flux
    .just(1, 2, 3, 4, 5, 6)
    .filter(n -> n%2 == 0)
    .map(n -> n*2)
    .subscribe(System.out::println)

 

  • Signal : Publisher 와 Subscriber 가 주고 받는 상호작용
  • Demand: Publisher 가 Subscriber 에 아직 전달하지 않은 데이터
  • Emit: Publisher 가 데이터를 방출하는 것
  • Upstream, Downstream: 데이터의 흐름(filter는 map 의 upstream, map 은 filter의 downstream)
  • Sequence: 데이터의 연속적인 흐름(데이터가 just 로 방출된 후 filter -> map -> subscriber 를 거치는 과정이 Sequence)
  • Operator: 데이터 연산자(filter 연산, map 연산~)
  • Source: 리액티브 프로그래밍 관련 문서에서 Source 라는 단어가 나오면 최초의 무언가로 해석

 

 

2.6 리액티브 스트림즈 구현체

 

RxJava

Project Reactor

Akka Streams

Java Flow API 등

 

(이 책에서는 Project Reactor / WebFlux를 다룬다)

댓글