📅 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
useinside 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를 좀 더 쓰게 될듯