MS는 왜 Rx를 만들었을까 feat. RxJS - 네이버, 김훈

참으로 뒤늦게 올리는 컨퍼런스 후기이다. 강의 내용은 여기서 제공되고 있다. 발표는 궁극적으로는 Rx에 대한 소개이며, 이해를 돕고자 Rx가 만들어진 배경을 초반에 설명하고 있음.

Rx란

  • Reactive Extensions의 약자
  • Observable Sequence와 LINQ-style query 연산자를 사용
  • 비동기와 이벤트 기반 프로그램을 조작하는 라이브러리

Reactive Extensions (Rx) is a library for composing asynchronous and event-based programs using observable sequences and LINQ-style query operators.

- MSDN, Reactive Extension

Rx의 역사

  • Rx의 정의를 보고 “이게 뭔지는 알겠는데 그래서 뭐?”라는 생각이 들었다고 함
  • Rx가 만들어진 배경을 조사하여 Rx의 개념을 좀 더 명확히 하고자 함
  • 결국 핵심은 비동기 프로그래밍
  • Rx를 만든 에릭 마이어의 말을 통해 이를 유추

Of all the work I’ve done in my career so far, this is the most exciting. […] I know it’s a bold statement, but I really believe that the problem of asynchronous programming events has been solved.

- 마이크로소프트 RX 릴리즈에 대한 기사

  • RxJS가 만들어진 것은 2010년 3월 17일
  • 이 때까지는 콜백 지옥을 극복할 만한 마땅한 기술이 없었다고 한다
  • Promises/A+가 처음 나온 게 2012년 12월 6일

=> 2016년에 와서야 Reactive를 접하고서 “이게 왜 그렇게까지 주목받는 걸까?”라고 생각하던 사람의 입장으로서 Rx의 탄생 배경이 이해가 됨

아래 내용은 참고.

어떤 개념을 정말로 이해하려면 그 개념이 최초로 언급된 당시의 전후 맥락을 재구성해 볼 필요가 있다. 이렇게 해야 개념의 정수가 그 모든 중간자를 거치고도 살아남았음을 확인할 수 있다.

- 프로그래머의 길, 멘토에게 묻다

Rx가 문제를 해결하는 방식

Rx의 탄생 배경이 비동기 프로그래밍이라고 했는데, 이제부터는 Rx가 어떻게 비동기 프로그래밍을 해결하는지 살펴봄

Reactive Programming

Reactive Programming은 말 그대로 반응하는 프로그래밍

pull vs push

  • 반응한다는 것의 의미는 pull-scenariopush-scenario의 차이로 설명 가능
    • pull-scenario
      • 프로그램이 외부 환경에 명령하여 원하는 결과를 획득
      • 이 경우 프로그램이 직접 제어의 흐름을 통제
    • push-scenario
      • 환경이 프로그램 안으로 요청을 밀어넣음
      • 외부에서 자극이 오면 그때 반응함
  • Reactive Programming은 push-scenario
    • 직접 외부에 필요한 것을 요청하는 대신, 외부로부터의 입력에 지속적이고 즉각적으로 반응함

Iterable vs Observable

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

*표 출처: reactivex.io

  • 우리가 익숙한 Iterable은 pull-scenario
  • Reactive는 Observable을 통해 push-scenario를 달성함
  • Observable은 Iterable가 제공하는 모든 기능을 지원함
  • 데이터가 흐르는 방향이 다를 뿐!

LINQ

Reactive Programming이 데이터에 접근하는 방법(외부의 자극에 반응)이라고 한다면, LINQ는 데이터를 처리하는 방법에 관한 것

  • Language Intergrated Query의 약자
  • 데이터를 질의하는 코드를 SQL 쿼리처럼 표현할 수 있도록 해주는 연산자
  • 코드를 보면 바로 이해됨
// 2가지 문법 스타일을 지원한다.
// 1. Query syntax:
IEnumerable<int> numQuery1 = 
    from num in numbers
    where num % 2 == 0
    orderby num
    select num;

// 2. Method syntax:
IEnumerable<int> numQuery2 = numbers
    .Where(num => num % 2 == 0)
    .OrderBy(n => n);

*출처: MSDN LINQ

“Your Mouse is a Database”

에릭 마이어는 “Your Mouse is a Database”라고 했음

=> 비동기 처리를 데이터베이스에 질의 하듯 접근하는 것이 개인적으로 인상적이어서 짧게나마 기록함

참고한 링크