📅 2023. 10. 22
FECONF 2023 use 훅이 바꿀 리액트 비동기 처리의 미래 맛보기 영상의 내용을 정리한 글입니다.
발표자: 문태근 (데브시스터즈)
React에서 비동기를 처리하는 과정 되짚어보기
useState
, useEffect
를 통해서 비동기를 처리
data
, error
, loading
처리를 위해 useQuery
와 같은 커스텀 훅 사용
React Query와 같은 Data Fetching 라이브러리를 사용
Suspense
와 ErrorBoundary
의 조합으로 데이터가 로딩 된 상태만 생각할 수 있게 됨
Data Fetch 다시 생각하기
fetch
에 바로 await
를 쓸 수는 없는걸까?use
훅use
는 Promise를 파라메터로 받아서 resolve된 값을 리턴하는 동기 함수의 시그니처를 가짐await
가 함수였다면 아래와 같은 모습이지 않을까?use
는 Suspense
를 발동시키는 트리거 역할을 하게될 것use()
가 실행되면, 가장 가까운 Suspense의 fallback이 렌더링 되는 방식use
는 아직 구현체가 정해지지 않았다.use
는 아직 사용할 수 없음use
를 호출하는 대신에 Promise를 throw
하는 방식으로 임시 구현use
는 새로운 hookawait
와 비슷한 역할use
로 Hook의 제약 벗어나기useInventory
는 userId: string
과 search: string
을 받아서 아이템을 조회하는 커스텀 훅item.name
은 항상 name
필드를 갖고 있지 않음normalItems
와 eventItems
는 어떻게 로딩해야 할까?페이지를 처음 접속하면 검색 키워드가 없기 때문에 리소스 데이터를 위한 블로킹은 불필요
문제 2. 응집도 저하
use
를 사용할 수 있는 곳
return
문 다음useMemo
, useReducer
, useEffect
에 전달한 클로저Before
use
만 쓰면 되나요?
use
는 low-level API, Data Fetching 라이브러리는 더 많은 기능을 제공cache
API는 React 공식 API로 추가될 예정이지만, 아직은 실험 단계이며 Server Component 에서만 사용이 가능
lodash.memoize
로 대체하여 구현함use
를 도입함으로써 해결했던 코드의 응집성 문제가 다시 나타남use
를 호출하는 함수가 컴포넌트나 훅이 아닌 클로저(filter) 함수이기 때문map
, filter
, reduce
사용 불가Theoretically, it will "work" in the runtime if you call
use
inside a function which itself is only called from inside a React Component or Hook, but this will be treated as a compiler error
async
/ await
는 자바스크립트의 문법 요소이기 때문에 컴파일러 기반 최적화가 가능
use
는 함수이지만 React 내에서는 문법 요소의 역할을 강제
await
는 async
함수 안에서만 사용 가능yield
는 generator
함수 안에서만 사용 가능use
도 Component / Hook 안에서만 사용 가능use
의 문법적인 제약은 앞으로 다가올 React 컴파일러 최적화를 위한 대비라고 볼 수 있음useMemo
만 최적화 해주는 게 아니였나?'use
에 문법적인 제약을 만드는 것은 DX 저하가 아닌가?'cache
API는 RFC도 없는 상태use
를 좀 더 쓰게 될듯