RxSwift 1.ReactiveX란?
ReactiveX란 무엇인가
ReactiveX is a library for composing asynchronous and event-based programs by using observable sequences. ReactiveX는 observable한 시퀀스를 이용해서 비동기의 이벤트 기반의 프로그램을 구성하는 라이브러리이다. 출처 : ReactiveX 공식 홈페이지
ReactiveX 혹은 Rx는 Reactive eXtension의 줄임말로, 반응형 (Reactive) 프로그래밍을 쉽게 사용할 수 있도록 확장(extension) 제공되는 라이브러리입니다. Rx는 데이터와 이벤트들의 흐름(sequence)를 지원하기 위해 observer pattern을 활용하였습니다. Observer pattern에서 사용되는 구독(Subscribe) 개념이 Rx에서도 유사하게 도입되어 있습니다. 또한, Rx는 선언형 (declarative) 패러다임을 차용하고 있습니다. 프로그래밍시 스레드 관리, 동기화, 스레드 동시 접근 제어, 병렬 데이터 구조나 비동기 처리와 같은 복잡한 로직 걱정 없이 스퀀스들이 무엇을 하게 할지를 제공되는 명령어(operators)를 이용하여 개발합니다.
Rx를 함수형 반응형 프로그래밍(Functional reactive programming)
으로 오해하는 경우가 있는데, Rx는 함수형(Functional)
이고 반응형(reactive)
패러다임을 지향하지만 함수형 반응형 프로그래밍(Functional reactive programming)
은 아닙니다. 함수형 반응형 프로그래밍(Functional reactive programming)
은 값을 지속적으로(continuously) 처리해야하지만, Rx의 함수들은 프로그램이 진행되면서 전달(emit)되는 연속적이지 않은 값(discrete values)들을 처리합니다.
즉, ReactiveX는 함수형, 반응형 패러다임을 제공하는 비동기 기반 이벤트를 효율적으로 처리하기 위해 도입된 라이브러리입니다.
Observables를 활용하는 이유 (Why use observables?)
Rx의 Observable model은 단순한 비동기 이벤트들의 흐름이나, array와 같은 자료구조(collections)들을 다루는 연산자들을 다루기 쉽게 합니다. 복잡한 콜백들 사용을 대체하여 읽기 쉽고 잠재적인 버그 발생의 위험을 줄여줍니다.
Observables는 구성하기 쉽다(Observables are composable)
비동기 작업을 하는 경우 main thread 의 동작에 제한이 가지 않도록 thread를 생성하여 동작을 제어해야하는 복잡함이 있습니다. 해당 문제를 쉽게 사용하기 위해 Java의 Future를 이용하여 비슷한 상황에서 활용 할 수 있으나, Future는 비동기를 중첩적으로 사용하는 경우에는 적합하지 못하다. Rx의 Observerbles을 이용하면 복잡한 비동기 데이터 흐름과 시퀀스(sequence)를 쉽게 작업 할 수 있습니다.
Observable은 유연하게 활용 할 수 있다(Obervables are flexible)
Java의 Future가 단일 값(single scalar values)의 발생에 대한 처리만 가능한 것 과는 달리 Rx의 Observables는 단일 값의 발생 뿐 아니라 데이터 시퀀스(sequence)나 무한하게 전달되는 값에 대한 처리도 가능합니다.
Observables은 구현 방식에 의존적이지 않다(Observables are less opinionated)
Rx는 동시성 또는 비동기 상황에 관계 없이 사용 가능합니다. Observables은 thread-pools, event loops, non-blocking I/O, actors, 혹은 당신의 코드 스타일이나 방식을 활용하여 구현 될 수 있습니다. 비동기 환경, blocking이나 non-blocking 혹은 필요한 방식 대로 구현 하도록 활용 할 수 있습니다.
Callbacks은 중첩된 비동기 구문에서 사용이 적합하지 않다(Callbacks have their own problems)
Callback은 그 무엇도 block 상태에 빠지지 않도록 하여 Future.get는 작업이 완료 될 때 까지 blocking되는 문제를 해소하였습니다. Callback을 이용하면 응답이 준비 될 때 실행되므로 효율적입니다. 그러나, Future와 마찬가지로 단순한 비동기 구문 (single level of asynchronous)을 실행할때는 쉽게 사용 할 수 있으나, 중첩된 비동기 구조에서는 사용이 복잡합니다.
Rx는 많은 언어를 통해 제공된다 (ReactiveX is a polyglot implementation)
Rx는 다양한 언어를 이용해서, 그들의 표현 양식(idiom)에 맞게 사용 할 수 있도록 제공되고 있습니다.
Reactive Programming 패러다임
- Rx는 반응형 프로그래밍(Reactive Programming) 패러다임을 따르고 있습니다.
반응형 프로그래밍이란?
Reactive programming is a declarative programming paradigm concerned with data streams and the propagation of change. With this paradigm it is possible to express static (e.g., arrays) or dynamic (e.g., event emitters) data streams with ease, and also communicate that an inferred dependency within the associated execution model exists, which facilitates the automatic propagation of the changed data flow.
반응형 프로그래밍이란 데이터의 흐름과 변경을 추적하는 것과 관련된 선언형 프로그래밍 패러다임이다. 이 패러다임은 정적 혹은 동적인 데이터의 흐름을 쉽게 표현할 수 있으며, 데이터 흐름의 변화를 자동으로 추적 가능하게 하기 위해서 관련된 실행 모델간의 의존성을 연결한다.
- 위의 인용문과 같이 반응형 프로그래밍은
데이터의 흐름
을 중심으로 하는 선언형 프로그래밍입니다. 데이터의 입력 혹은 변화가 발생하는 경우무엇(What)
을 할지를 작성하는데 중점을 두고 있으며, 비동기 상황에서 데이터의 변화에 따른 동작을 쉽게 대응 할 수 있다는 특징을 가지고 있습니다.
출처