우선 이해하기 쉽게 코드로 바로 알아보자.
// app/getQueryClient.ts
import {
defaultShouldDehydrateQuery,
isServer,
QueryClient,
} from "@tanstack/react-query";
function makeQueryClient() {
return new QueryClient({
defaultOptions: {
queries: {
// SSR에서 기본적으로 사용하는 staleTime
// client에서 바로 재요청을 막기 위해서 0보다 높은 값으로 설정한다.
staleTime: 60 * 1000
},
dehydrate: {
shouldDehydrateQuery: (query) =>
defaultShouldDehydrateQuery(query) || query.state.status === "pending",
},
},
});
}
let browserQueryClient: QueryClient | undefined = undefined;
export function getQueryClient() {
if (isServer) {
// 서버에서는 항상 queryClient를 생성한다.
return makeQueryClient();
} else {
// 브라우저에서는 queryClient가 없는 경우에만 새 queryClient를 만든다.
// queryClient는 매우 중요하므로 초기 렌더링 중에 React가 일시 중단되는 경우 새 클라이언트를 만들지 않는다. queryClient 생성 아래에 서스펜스 경계가 있는 경우 이 작업이 필요하지 않을 수 있다.
if (!browserQueryClient) browserQueryClient = makeQueryClient();
return browserQueryClient;
}
}
우선 queryClient를 서버와 클라이언트 각각 생성한다. 만약 서버 컴포넌트에서 getQueryClient() 함수를 호출하면 queryClient를 새로 생성하고
서버 컴포넌트에서 React-query를 사용하기 전에 prefetchQuery에 대한 이해가 필요하다. prefetchQuery란, 특정 데이터가 필요할 것으로 예상되는 경우 프리페칭을 사용하여 캐시를 해당 데이터로 미리 채우는 것으로 더욱 빠른 사용자 경험을 제공할 수 있다.