토스 비동기 처리하기

비동기 프로그래밍

  • 순서가 보장되지 않는 경우
  • 좋은 사용자 경험을 위해 필수
  • callback, Promise, RxJS

좋은 코드에 대한 생각으로 돌아가자

  • 코드의 좋은점 / 나쁜점
  • 하는일은 단순하지만 코드가 너무 복잡, 각 프로퍼티에 접근하는 핵심 기능이 코드로 잘 드러나지 않는다
1
2
3
4
5
6
7
function getBazFromX(x){
   if(x === undefined) {
    return undefined;
   }
   if() {}
   if() {}
}
  • if 문들이 너무 많음 es6로 단순화 시킬 수 있음

좋은코드특징

  • 성공하는 경우만 다루고 실패하는 경우는 catch 절에서 분리해 처리

나쁜코드특징

  • 실패, 성공의 경우가 섞여서 처리되는경우

프론트엔드 웹서비스 비동기 처리 어떻게 했나?

  • SWR, React Query 사용
  • 여러개의 비동기 작업이 동시에 실행된다면?
  • 로딩중, 에러, 완료 보통 3개지 상태인데
  • 비동기 처리가 3,4개면 더욱 복잡해짐
  • 성공하는 경우에만 집중해 컴포넌트를 구성하기 어렵다.
  • 2개 이상의 비동기 로직이 개입할 때, 비즈니스 로직을 파악하기 점점 어려워진다. -> React Suspense for Data Fetching으로 해결할 수 있다.

React Suspense for Data Fetching

  • 성공한 경우에만 집중
  • 로딩상태와 에러상태 분리
  • 동기와 거의 같게 사용
  • low-level api 제공
  • 함수의 에러상태를 catching 하는 것처럼 에러상태는 ErrorBoundary
  • 비동기를 동기적으로 바꿔주는 suspense를 사용

토스팀에서 적용한 제품

  • TUBA (A/B 테스트 설정, 전환율 분석, 알림 등)
    • Recoil 비동기 리소스 selector, selectorFamily로 정의할수 있다.
    • 데이터가 준비되는대로 하나씩 자연스럽게 보여줌
    • 에러 처리의 복잡도를 낮춘방법 : try-catch

대수적 효과

  • 실제 관련된 처리는 컴포넌트를 감싸는 부모함수에 위임

React Concurrent Mode, useTransition, useDeferredValue