노트

useSuspenseQuery

useSuspenseQuery

프런트엔드#react · 연결된 개념 3개

쉽게 말하면

useSuspenseQuery는 배우가 의상을 다 갖춰 입을 때까지 무대에 나오지 않는 것처럼, 데이터가 오기 전엔 컴포넌트가 화면에 나서지 않게 하는 훅이에요. 기다림은 Suspense가, 실패는 에러 경계가 맡아 성공 코드만 남아요.

비유가 깨지는 곳 대기실에서 한 명씩 준비하면 늦어져요. 한 컴포넌트에서 두 번 쓰면 첫 요청에서 멈춰 두 번째가 늦게 시작되는 워터폴이 생기니 useSuspenseQueries나 prefetch로 병렬로 받아요. enabled 옵션도 없어요.

useSuspenseQuery는 TanStack Query의 결과를 Suspense와 에러 경계(Error Boundary)에 맡기는 훅이다. 로딩 중이면 컴포넌트가 suspend되고, 실패하면 에러가 던져진다. 그래서 컴포넌트 안에는 성공한 경우의 코드만 남는다.

function Profile() {
  const { data } = useSuspenseQuery({ queryKey: ['user'], queryFn: fetchUser })
  return <div>{data.name}</div>          // data는 항상 정의됨
}
 
<ErrorBoundary fallback={<ErrorView />}>
  <Suspense fallback={<Spinner />}><Profile /></Suspense>
</ErrorBoundary>
  • data가 undefined일 수 없다. 타입이 바로 확정돼 옵셔널 체이닝과 null 검사가 사라진다
  • 여러 컴포넌트의 로딩을 경계 하나로 묶어 보여 주기 쉽다
  • enabled가 없다. 항상 실행되는 것이 전제라 조건부 요청은 일반 useQuery로 한다
  • 워터폴(Request Waterfall) 주의: 같은 컴포넌트에 useSuspenseQuery를 두 번 쓰면 첫 번째에서 suspend되어 두 번째 요청이 늦게 시작된다. 병렬로 기다리려면 useSuspenseQueries를 쓰거나 미리 prefetch한다
  • 백그라운드 재요청 상태(isFetching)를 UI에 세밀하게 반영하거나 컴포넌트 단위로 스피너를 다루려면 일반 useQuery가 유연하다

"이 데이터가 없으면 화면을 그릴 수 없다"가 분명하고 Suspense 기반 구조를 쓰는 앱에 맞는다. 기본기는 TanStack Query, React 자체의 Promise 읽기는 use()로 Promise 읽기.

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 서버 렌더에서 훅이 하는 일

    서버 렌더(Server-Side Rendering, SSR)에서도 컴포넌트 함수는 실제로 호출되고, 그 안의 훅도 호출은 된다. 다만 서버에는 커밋(DOM 반영)이 없어서, 렌더 중 동기적으로 값을 계산하는 훅만 일하고 커밋 뒤에 도는 훅은 아무것도 하지 않는다. "이 훅은 클라이언트에서만 동작한다"는 말은 대개 "Effect 안의 일은 클라이언트에서만 일어난다"는 뜻이다.

  • 쿼리 키 설계와 키 팩토리

    쿼리 키(Query Key)는 TanStack Query가 캐시 항목을 식별하고 무효화 범위를 고르는 배열이다. 키를 일반적인 것에서 구체적인 것 순서로 쌓고, 한 곳(키 팩토리)에서 만들게 하면 부분 일치(Partial Matching)로 원하는 범위만 정확히 무효화할 수 있다.

  • useSyncExternalStore

    useSyncExternalStore는 React 밖에 있는 상태(외부 스토어(External Store), 브라우저 API(Application Programming Interface))를 구독해 컴포넌트와 동기화하는 훅이다. 동시성 렌더링(Concurrent Rendering)에서도 모든 컴포넌트가 같은 스냅샷을 보게 보장해 tearing을 막는다(React 18+).

  • useTransition

    useTransition은 특정 상태 업데이트를 "급하지 않음(transition)"으로 표시해, 그 렌더 중에도 입력 같은 긴급한 업데이트가 먼저 처리되게 하는 훅이다. [isPending, startTransition]을 반환한다.

  • useActionState와 폼 액션

    React 19에서는 <form action={함수}>에 함수를 바로 넘길 수 있고, useActionState가 그 액션의 대기 상태와 마지막 결과를 한 훅으로 관리한다. useState + onSubmit + 로딩 플래그로 짜던 패턴을 대체한다.

보기 옵션