ReactiveX는 관찰 가능한 시퀀스를 사용하여 비동기 및 이벤트 기반 프로그램을 구성하기 위한 라이브러리이다.

이 라이브러리는 옵저버 패턴을 확장하여 데이터 및 이벤트 시퀀스를 지원하고 낮은 수준의 스레드화, 동기화, thread safety, 동시성 데이터 구조 및 비차단 I/O와 같은 문제를 추상화하면서 선언적으로 시퀀스를 함께 구성할 수 있는 연산자를 추가한다.

옵저버블은 여러 항목의 비동기 시퀀스에 액세스하는 이상적인 방법이 되어 격차를 메움

single items multiple items
synchronous T getData() Iterable<T> getData()
asynchronous Future<T> getData() Observable<T> getData()

ReactiveX는 때로 “functional reactive programming(기능적 반응형 프로그래밍)”이라고 불리지만 이것은 잘못된 이름이다. ReactiveX는 functional(기능적) 할 수도 있고 reactive(반응적) 할 수도 있지만 “functional reactive programming”은 전혀 다른 것이다. 주요한 차이점 중 하나는 functional reactive programming이 시간이 지남에 따라 지속적으로 변경되는 값에서 작동하는 반면 ReactiveX는 시간이 지남에 따라 방출되는 불연속적인 값에서 작동한다는 것이다. (Functional reactive programming에 대한 보다 정확한 정보는 Conal Elliott의 작업을 참조.)

Why Use Observables?

ReactiveX 옵저버블 모델을 사용하면 Array와 같은 데이터 컬렉션에 사용하는 것과 동일한 종류의 단순하고 구성 가능한 작업으로 비동기 이벤트 스트림을 처리할 수 있다. 이를 통해 우리를 복잡한 콜백 구조로부터 자유롭게 해줌으로서 우리의 코드를 더 읽기 쉽고 버그가 덜 발생하도록 만들어준다.

Observables Are Composable

Java Futures와 같은 기술은 단일 수준의 비동기 실행에 사용하기 쉽지만 중첩될 때 사소하지 않은 복잡성을 추가하기 시작한다.

조건부 비동기 실행 흐름을 최적으로 구성하기 위해 Futures를 사용하는 것은 어렵다(또는 각 request의 대기 시간이 런타임에 다르기 때문에 불가능함). 물론 이 작업을 수행할 수 있지만 빠르게 복잡해지거나(이에 따라 오류가 발생하기 쉬움) Future.get()을 조기에 차단하여 비동기 실행의 이점을 제거한다.

반면, ReactiveX 옵저버블은 비동기 데이터의 흐름과 시퀀스를 구성하기 위한 것이다.

Observables Are Flexible

ReactiveX 옵저버블은 단일 스칼라 값(Future 처럼)의 방출뿐 아니라 값의 시퀀스 또는 무한 스트림도 지원한다. 옵저버블은 이러한 사용 사례에 사용할 수 있는 단일 추상화이다. 옵저버블은 Iterable과 유사하며 이와 관련된 모든 유연성과 우아함을 가지고 있다.

옵저버블은 synchronous/pull Iterable에 대한 asynchronous/push “dual”이다

event Iterable (pull) Observable (push)
retrieve data T next() onNext(T)
discover error throws Exception onError(Exception)
complete !hasNext() onCompleted()