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를 다룬다)
'2023~ > 스프링으로 시작하는 리액티브 프로그래밍' 카테고리의 다른 글
Ch06 마블 다이어그램 (0) | 2024.09.19 |
---|---|
Ch05 Reactor 개요 (0) | 2024.09.18 |
Ch04 리액티브 프로그래밍을 위한 사전 지식 (0) | 2024.09.17 |
Ch03 Blocking I/O 와 Non-Blocking I/O (0) | 2024.08.28 |
Ch01 리액티브 시스템과 리액티브 프로그래밍 (0) | 2024.08.22 |
댓글