MS는 Rx를 왜 만들었을까?

Category
스터디노트 RX패턴
Status
Published
Tags
RX 패턴
Description
Published
Slug
 

Rx

비동기와 이벤트 기반 프로그램을 작성하는데 필요한 Observable 시퀀스 처리 라이브러리
 
→ 비동기 프로그래밍의 문제를 해결하기 위해 만들어짐
 

Rx를 지탱하는 핵심 키워드 3가지

  1. Reactive Programming
  1. LINQ to Events (Language INtergrated Query - 통합질의 언어)
  1. Scheduler
 
 

Reactive Programming

→ 데이터 플로우와 상태 변경을 전파한다는 생각에 근간을 둔 프로그래밍 패러다임
→ 계속 응답하는 시스템
 
→ 리액티브 프로그래밍의 목적은? (외부에서 들어오는 자극에 반응하는 구조를 만드는 것)
반응 : 자극은 밖에서 안으로 흐름. 자극이 있어야만 반응하는 수동성
 
iterator은 연속하는 데이터를 pull 시나리오로 가져옴(달라고 함)
notion image
 
observer은 외부에서 데이터를 주입하는 push 시나리오
notion image
 
 
iterator와 observable은 데이터 흐르는 방향이 반대
notion image
 

LINQ to Events (Language INtergrated Query - 통합질의 언어)

→ Rx는 외부에서 들어온 데이터를 단순히 목적지까지 운반하는데 그치지 않고,
event와 LINQ라는 개념을 결합한 인터페이스를 제공함
 
옵져버블로 들어온 데이터를 LINQ스타일로 처리할 수 있음
→ 이것을 operator라고 함
 
쿼리를 언어에 통합해서 코드상에서 데이터에 대한 질의를 할 때.
마치 SQL 쿼리를 작성하는 것 처럼 해줌
 
Rx가 제공하는 LINQ스타일의 operator은 메소드 구문을 사용함
(메소드를 체이닝 하듯이)
// Quert syntax: IEnumerable<int> numQuery1 = from num in numbers where num % 2 == 0 orderby num select num; // Method syntax: IEnumerable<int> numQuery2 = numbers .Where(num => num % 2 ==0) .OrderBy(n => n)
 
observable은 제어가 흐르는 방향을 뒤집어서, 비동기 처리에 유리한 토대를 제공
그렇게 들어온 데이터를 LINQ는 외부에서 stream으로 들어온 데이터를 선언적으로 처리할 수 있는
간결한 문법을 제공함
 
두개를 결합하면 외부에서 stream을 타고 들어오는 데이터를 마치 DB의 쿼리를 작성하는 것 처럼 표현할 수 있음
 
 
마우스가 움직이면, observable은 위치 좌표등을 캐치해서 안으로 보냄
 
마우스가 이벤트를 받는 스트림을 생성하는 코드
const targetElement = document.getElementById('dragElement'); const drag$ = Rx.Observable .fromEvent(targetElement, 'mouseup');
 
LINQ스타일로 operator를 만듦 → 마치 데이터가 흘러갈 회로를 설계하는 것.
LINQ 스타일로 작성된 operator를 타고 흐르며
원하는 모양으로 데이터가 변형되고 필터링 됨.
const targetElement = document.getElementById('dragElement'); const drag$ = Rx.Observable .fromEvent(targetElement, 'mouseup'); drag$ .flatMap(ev => ({ startX: ev.pageX, startY: ev.pageY }));
 
최종 목적지에 도착하면 원하는 응답을 함
subscribe → 외부 자극을 구독하겠다
const targetElement = document.getElementById('dragElement'); const drag$ = Rx.Observable .fromEvent(targetElement, 'mouseup'); drag$ .flatMap(ev => ({ startX: ev.pageX, startY: ev.pageY })); drag$.subscribe(pos => { console.log(pos); });
 
 

Scheduler

→ 비동기(멀티스레드) 환경에서 오퍼레이터 실행시점 제어
실행시점을 제어하거나, operator를 실행할 스레드 등을 지정
 
 
 
Rx와 리액티브 프로그래밍은 같은게 아님.
Rx가 리액티브 프로그래밍을 하는데, 유리한 몇 가지 장치들을 제공하는 것임
 
Reactive Programming과 Functional Reactive Programming(함수형 - FRP)