
 
<ReactQueryDevtools initialIsOpen />의 코드를 QueryClientProvider 내부에 넣음으로써 아래와 같은 Dev Tool을 이용할 수 있습니다.일반적으로 Tanstack Query를 이용한 Component 작성시 아래와 같이 작성합니다.
function Todos() {
  const { isPending, isError, data, error } = useQuery({
    queryKey: ['todos'],
    queryFn: fetchTodoList,
  })
  if (isPending) {
    return <span>Loading...</span>
  }
  if (isError) {
    return <span>Error: {error.message}</span>
  }
  // We can assume by this point that `isSuccess === true`
  return (
    // Some components to render...
  )
}하지만 QueryErrorResetBoundary을 이용한다면 더 선언적으로 Error와 Loading상태를 사용 할 수 있습니다.
그러기 위해서는 먼저 React.Suspense와 ErrorBoundary에 대해 알 필요가 있습니다.
Tanstack Query의 QueryErrorResetBoundary는 하위 컴포넌트들이 에러가 일어났을 때 re-rendering을 지원합니다. react-error-boundary의 ErrorBoundary와 함께 사용하면서 컴포넌트의 경계 내에서 에러가 일어났을 때 reset할 수 있습니다.
export function DataContainer({ queryKey, fetchData }: DataContainerProps) {
  return (
    <QueryErrorResetBoundary>
      {({ reset }) => (
        <ErrorBoundary onReset={reset} FallbackComponent={ErrorFallback}>
          <React.Suspense fallback={<LoadingFallback/>}>
            <DisplayData queryKey={queryKey} fetchData={fetchData} />
          </React.Suspense>
        </ErrorBoundary>
      )}
    </QueryErrorResetBoundary>
  );
}위와 같이 코드를 작성하면 해당 컴포넌트의 fetch에서 Error가 발생 할 경우 ErrorFallback을, 로딩 중일 때는 Suspense의 LoadingFallback을 렌더링 할 수 있습니다.
위의 코드의 장점으로는
1. 선언적 접근이 가능합니다 : 기존의 방법으로는 명령적이고 반복적으로 코드를 선언하게 됩니다.
2. 관심의 분리 : 기존 컴포넌트에서는 일반적인 경우 렌더링만 신경 쓰고, 에러와 로딩 처리에 대해서는 다른 컴포넌트가 렌더링을 담당하게 됩니다.
3. 컴포넌트 경계 관리 : ErrorBoundary와 Suspense를 이용하면 에러와 로딩 렌더링의 범위를 직접 정할 수 있게 됩니다.
4. 에러 캡쳐링 : ErrorBoundary는 하위 컴포넌트의 모든 Error를 캡쳐링 하기 때문에, 에러가 관리가 용이할 수 있습니다.