인프런 커뮤니티 질문&답변

웹개발자님의 프로필 이미지
웹개발자

작성한 질문수

Next + React Query로 SNS 서비스 만들기

react-query SSR 설정하기

prefetch 질문

작성

·

82

0

안녕하세요!

저는 fetch를 사용하지않고 axios를 사용해봤는데요!

서버에서 prefetch한 데이터가 초기에 useQuery에 값이 없는 이슈가 있어서 디깅을 해보다가 ReactQueryProvider에서 선언한 queryClient와 Home.tsx에서 선언한 queryClient가 달라 캐시한 값을 가져오지 못한다고 생각하는데 혹시 맞을까요?

 

"use client";

import { useState } from "react";

import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
import { isProduction } from "@/app-src/shared/env";

export const ReactQueryProvider = ({ children }: React.PropsWithChildren) => {
  const [queryClient] = useState(
    () =>
      new QueryClient({
        defaultOptions: {
          queries: {
            staleTime: Infinity,
            gcTime: Infinity,
          },
        },
      })
  );

  return (
    <QueryClientProvider client={queryClient}>
      {children}
      {!isProduction && <ReactQueryDevtools initialIsOpen={false} />}
    </QueryClientProvider>
  );
};

 

import { PostIndex } from "@/app-src/post/[slug]";
import { API_PATH } from "@/app-src/shared/apis";
import { getPost } from "@/app-src/shared/apis/post/get-post";
import {
  dehydrate,
  HydrationBoundary,
  QueryClient,
} from "@tanstack/react-query";

const PostPage = async ({ params }: { params: { slug: string } }) => {
  const { slug } = params;
  const queryClient = new QueryClient();

  

  // 서버에서 미리 데이터를 패칭
  await queryClient.prefetchQuery({
    queryKey: [API_PATH.POST(slug)],
    queryFn: () => getPost(slug),
  });

  const a = queryClient.getQueryData([API_PATH.POST(slug)]);

  console.log(a, "a");

  // 데이터 직렬화
  const dehydratedState = dehydrate(queryClient);

  return (
    <HydrationBoundary state={dehydratedState}>
      <PostIndex />
    </HydrationBoundary>
  );
};

export default PostPage;
"use client";

import { API_PATH } from "@/app-src/shared/apis";
import { getPost } from "@/app-src/shared/apis/post/get-post";
import { useQuery } from "@tanstack/react-query";
import { useParams } from "next/navigation";

export const PostIndex = () => {
  const { slug } = useParams<{ slug: string }>();
  

  const { data } = useQuery({
    queryKey: [API_PATH.POST(slug)],
    queryFn: () => getPost(slug),
  });

  // 초기에 없음 -> 패칭 -> 있음
  console.log(data, "data");

  

  return (
    <div>
      <div>{data?.title}</div>
    </div>
  );
};

만약 제가 생각한게 맞다면 어떻게 해결해야할까요?

답변 1

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

해결하셨나요??

웹개발자님의 프로필 이미지
웹개발자

작성한 질문수

질문하기