Ping 02/Nov/2020

Posted on Nov 2, 2020

(functional) reactive 관련들을 다시 찾아 보고 있다.

예전에 webdev은 아니고 백엔드를 위해서 rxjs 을 쓸 일이 있었었고 꽤 재밌었다. node.js에서 async/await 이전에 동시성 처리를 하기에 유용하게 쓸 수 있었었고, 실은 그냥 monad이어서 조금만 이해를 하고 사용하면 여러모로 편리했었다.

https://github.com/stoeffel/awesome-frp-js 여기에 보면 rxjs이외에도 다른 js을 위한 FRP라이브러리들이 많이 생겼었다.

그 중에 흥미가 있어서 bacon.js 을 읽고 rxjs에서 만들어 본 작은 예제 프로젝트를 다시 작성해봤다. 깔끔했다.

rxjs으로 작성했었던 작은 예제는 다음과 같다.

  import { fromEvent, Subject } from 'rxjs';
  // eslint-disable-next-line object-curly-newline
  import { debounceTime, mapTo, scan, map } from 'rxjs/operators';
  import jquery from 'jquery';

  const counter$ = new Subject();
  counter$
    .pipe(
      scan((n, acc) => n + acc, 0),
      debounceTime(100),
    )
    .subscribe((count) => jquery('#count').text(count));

  const counter2$ = new Subject();
  counter2$
    .pipe(scan((n, acc) => n + acc, 0))
    .subscribe((count) => jquery('#count2').text(count));

  const increase$ = fromEvent(jquery('#increase'), 'click').pipe(mapTo(1));
  const decrease$ = fromEvent(jquery('#decrease'), 'click').pipe(mapTo(-1));

  increase$.subscribe(counter$);

  increase$.pipe(map((n) => n * 10)).subscribe(counter2$);

  decrease$.subscribe(counter$);

  decrease$.pipe(map((n) => n * 10)).subscribe(counter2$);

(package.json, webpack.config.js, 관련 html 파일 등은 생략했다.)

Observable을 input/output으로 사용하고 서로 연결하는 여러 가지 패턴들을 잘 수용할 수 있을지 테스트 해보았다.

하지만 어차피 rxjs을 어느 정도 이해하고 있어서 굳이 전환할 생각은 들지 않는다.

여러 가지로 js으로 재밌게 쓸만한 것이 많아진 시대인 것 같다.

더 흥미로운 생각은, 이런 거의 대부분의 것들이 실은 예전에도 가능한 것들이었다. 예를 들어, FRP라이브러리를 만들거나 대부분의 shims 같은 것들이 실은 js이 유연함으로 인해서 예전에도 충분히 구현이 가능했었으리라 생각했다.1

하지만 당시에(2007~2010년 정도?) js으로 이런 것들을 조금 만들고 있으면, 어떤 이들은 그 자신이 "진지한" 언어라고 생각하는 그런 언어에 비해 다른 루비나 리습, js같은 언어는 열등하다고 생각하고, 또 그런 것들에 내가 열심인 이유는 단지 내가 fanboy이어서 그런 것들으로 코딩을 한다고 믿던 이는 우습게 생각했었던 것 같다. 하지만 내가 지금에 와서 생각해 보면 그런 이가 믿던 '진지한 언어'에 대해서 그런 이가 가장 fanboy였었던 것은 아닌가 싶다.

Footnotes


1

물론 html5, es5에 들어서 추가된 api들이 많아서 그런 것들을 모두 수용하지는 못했겠지만.