리엑티브 프로그래밍 - ChoDragon9/posts GitHub Wiki
리엑티브 프로그래밍 정의
리엑티브 프로그래밍은 비동기 데이터 스트림으로 프로그래밍하는 것이다. 외부에서 들어오는 요청에 계속해서 응답하는 시스템으로 상태변경을 전파한다. 그래서 함수형은 예측가능한 코드를 만든다면 리엑티브는 분리된 코드를 가능하게 한다.
스트림은 시간순으로 정렬된 진행중인 이벤트의 나열이다. 스트림은 값, 에러, 완료 신호 세가지 이벤트를 발생시킨다. 스트림은 변수, 사용자 이벤트, 프로퍼티들, 캐시, 자료구조 모두가 될 수 있다. 스트림은 아래와 같이 표시할 수 있다.
--a---b-c---d---X---|->
a, b, c, d are emitted values
X is an error
| is the 'completed' signal
---> is the timeline
스트림은 만들고 조합하고 필터링하여 다양항 기능을 구현 할 수 있다.
clickStream: ---c----c--c----c------c-->
vvvvv map(c becomes 1) vvvv
---1----1--1----1------1-->
vvvvvvvvv scan(+) vvvvvvvvv
counterStream: ---1----2--3----4------5-->
반응
반응은 아래 두 가지 의미를 내포한다.
- 자극은 밖에서 안으로 흐른다.
- 자극이 있어야만 반응하는 수동성을 갖는다.
외부 환경과 커뮤니케이션을 하는 방법은 크게 두 가지가 있다. Pull Scenario 그리고 Push Scenario.
- Pull Scenario는 우리에게 익숙한 방식으로 프로그램이 외부 환경에 명령하여 원하는 결과를 획득하는 방식이다. 이 경우 프로그램이 직접 제어의 흐름을 통제한다.
- Push Scenario는 이를 뒤집어서, 환경이 프로그램 안으로 요청을 밀어넣는다. 외부 환경에 명령을 하고 응답이 오기까지 기다리는 것이 아니라, 외부에서 응답이 오면 그때 반응한다.
Observable 발생과정
리액티브 프레임워크 개발팀은 이 지점에서 Iterator 패턴과 Observer 패턴이 쌍대관계라는 점을 알아냈다. Iterator는 연속하는 데이터를 Pull Scenario로 가져온다. Observer는 외부에서 데이터를 주입받는 Push Scenario라고 볼 수 있다. 이벤트를 여러 번 호출하면, 연속하는 데이터를 주입할 수 있는데 이는 Iterator와 본질이 같다. 다만 데이터가 흐르는 방향이 다를 뿐이다. Rx는 외부에서 안으로 연속해서 밀어넣는 데이터를 받을 수 있는 인터페이스인 Observable를 제공함으로써 리액티브 프로그래밍을 지원한다.
여기까지 보면 느낌이 Promise랑 비슷하다. 차이가 있다면 Promise는 단일 값을 처리하고, Observable은 여러 값을 처리한다.
LINQ와 이벤트 결합
Rx는 외부에서 들어온 데이터를 단순히 목적지까지 운반하는 데 그치지 않는 다. 더 나아가 이벤트와 LINQ라는 개념을 결합한 인터페이스를 제공하는 데, 이를 이용하면 Observable로 전달받은 데이터를 LINQ 스타일로 처리할 수 있다. 이를 오퍼레이터라고 한다.