ReactiveX는 관찰 가능한 시퀀스를 사용하여 비동기 및 이벤트 기반 프로그램을 구성하기 위한 라이브러리입니다.
데이터 또는 이벤트 시퀀스를 지원하기 위해 관찰자 패턴을 확장하고 저수준 스레딩, 동기화, 스레드 안전, 동시 데이터 구조 및 비차단 I/O와 같은 것들에 대한 우려를 추상화하면서 시퀀스를 선언적으로 함께 구성할 수 있는 연산자를 추가합니다.
Observables는 여러 항목의 비동기 시퀀스에 접근하는 이상적인 방법으로 격차를 메웁니다.
| 단일 항목(single items) | 다중 항목(multiple items) | |
|---|---|---|
| 동기(synchronous) | T getData() |
Iterable<T> getData() |
| 비동기(asynchronous) | Future<T> getData() |
Observable<T> getData() |
때때로 ***함수형 반응형 프로그래밍(Functional Reactive Programming)***이라고 불리지만 이는 잘못된 명칭입니다. ReactiveX는 함수형일 수도 있고 반응형일 수도 있지만, “Functional Reactive Programming”은 아예 다른 종입니다. 한 가지 주요한 차이점은 Functional Reactive Programming은 시간이 지남에 따라 지속적으로 변화하는 값에서 동작하는 반면, ReactiveX는 시간이 지남에 따라 방출되는 분리된 값에서 작동한다는 것입니다. (FRP에 대한 더 정확한 정보는 Conal Elliott의 작업을 참조해주세요.)
ReactiveX Observable 모델을 사용하면 배열같은 데이터 항목 컬렉션에 사용하는 것과 동일한 종류의 간단한 작업으로 비동기 이벤트 스트림을 처리할 수 있다. 그것은 ***“얽힌 콜백 거미줄 문제”***에서 우리를 해방시켜주고, 코드를 더 읽기 쉬우면서 버그에는 덜 취약하게 만들어줍니다.
Java Futures와 같은 기술은 단일 수준의 비동기 실행에서는 사용하기 쉽지만, 중첩될수록 점점 복잡해지기 시작합니다.
조건부 비동기 실행 플로우를 최적으로 구성하기 위해 Futures를 사용하는 것은 어렵습니다. (또는 각 요청의 대기 시간이 런타임 별로 다르기 때문에 불가능합니다.) 물론 할 수는 있지만, 빠르게 복잡해지거나(따라서 오류가 발생하기 쉬워짐) 비동기 실행의 이점을 제거하는 Future.get() 에서 조기에 차단됩니다.
반면에 ReactiveX Observables는 비동기 데이터의 흐름과 시퀀스를 구성하기 위한 것입니다.