본문 바로가기

카테고리 없음

세션 복습 - 비동기를 우아하게 처리하기 위한 Observable

반응형

[Track 2-2] 나석주 - 비동기를 우아하게 처리하기 위한 Observable - YouTube

토스 개발자 나석주님의 Promise의한계, Observable 소개, RxJs 비동기 프로그래밍, Advanced RxJS를 주제로 한 세션이다.

공개 ppt가 없어 복습 차원에서 세션 내용을 정리함

 

웹에서 처리하는 비동기들

  • Dom Events
  • Ajax
  • Animation
  • 시간 (쓰로틀링, 디바운스)
  • 웹소켓, 워커

콜백의 문제는 콜백헬
인터넷 익스플로러 제외 다 사용 가능

프로미스의 한계

  • 취소 불가
    • 성공 또는 실패 불변 상태로만 값을 보장
  • 단일값(중요)

왜 취소가 필요할까요

자동완성(이전 요청에 대한 취소 필요) 

취소를 안하면 뒤 결과가 앞 결과를 덮어씀

라우트 변경

임프레션

사용자가 원할 때

 

단일값

다 여러개의 값을 다룸

  • Dom Events
  • Ajax
  • Animation
  • 시간 (쓰로틀링, 디바운스)
  • 웹소켓, 워커

옵저버블

  • 비동기로 발생하는 여러 데이터를 다루는 인터페이스,
  • 이벤트 스트림
  • 취소 가능

옵저버블 생성

옵저버블 에러 처리

error 함수로 에러 처리
클린업 : 이벤트 리스너나 ajax 중단 시 사용

옵저버블 생성

인자로부터

 

이터러블이나 옵저버블로부터

컴포지션

컴포지션이 강력한 이유

위에서 아래로 흐르는 듯

위는 ts39 제안 스테이지1 상태임

RxJs

  • 옵저버블 구현체 제공
  • 컴포지션 및 생성 유틸리티(오퍼레이터) 제공
    • 옵저버블을 재활용하여 성능 업
  • 스케줄링

옵저버블 생성 유틸리티

파이핑

프로토타입을 수정하지 않고 pipe사용

예제 : 자동완성 스펙

  • 입력값이 바뀌면 검색결과를 Ajax로 불러와 결과를 화면에 표시한다.
  • 입력값은 150ms 간격으로 디바운스 처리한다.
  • 입력값이 바뀌면 이전 Ajax 요청은 취소시킨다.

각 줄을 설명해보자

예제 : 마블 다이어그램

정의와 기호
map 오퍼레이터. 키보드 입력을 입력 값으로 변경
디바운스는 가장 최근 값만 처리함
스위치맵은 바깥의 옵저버블을 내부의 옵저버블(다른 옵저버블)로 교체함
catchError 쓰는 이유 
안이 죽으면 밖이 죽기 때문에 캐치를 안에다 걸어줘야함

캐치에러는 안에다 걸어주자!!

자동완성 디바운스!

옵저버블이 좋은 선택일 수 있는 이유

비동기 코드를 더 깔끔하게 작성할 수 있음

  • Pull
    • 외부에 명령하여 응답받고 처리
    • 값을 가져오기 위해 계속 호출
    • iteration
  • Push
    • 외부에서 응답이 오면 그때 반응하여 처리
    • 값을 가지고 오기 위해 구독
    • 옵저베이션

 

웹에서 다루는 대부분의 비동기는 푸시 모델이 적합 (리덕스 사가는 푸시를 풀로 바꿈)

결론

  • Observable
    • 비동기로 발생하는 여러 데이터를 처리할 수 있다
    • 취소 가능
  • 옵저버블 합성
    • 비동기 흐름을 선언적으로 작성
  • 옵저버블은 푸시 형태의 비동기 처리에 적합한 모델
    • 웹의 비동기 대부분이 푸시 형태이다.
    • 옵저버블이 비동기 처리에 좋은 옵션이 될 수 있다

은총알은 없다

러닝커브

디버깅

표준 스펙으로 채택의 어려움

  • 명료하지 않은 API
  • 논의가 이루어지고 있음

RxJS 스케줄링과 디버깅

언제 구독이 시작될지, 전달될지 타이밍을 계산

animationFrameScheduler 

다음 requestAnimationFrame에 값이 전달됨.

무한대의 값을 반환하는데, 얼마나 시간이 흘렀는지 옵저버블로 반환함

디퍼는 팩토리 함수 구독 시작된 시점부터 이벤트 시작

파이프라인 신택스
스테이지 1이라 못씀

 

반응형