[Next.js & React-Query] 서버 컴포넌트에서 QueryClient 호출하기

2025. 4. 28. 17:49·Next.js

Next.js의 서버 컴포넌트에서 prefetchQuery를 사용하기 위해서는 queryClient가 필요하다.

매 컴포넌트마다  queryClient를 생성하면 여러 서버 컴포넌트에서 동일한 queryClient에 접근해야될 때 비효율적이므로, queryClient 컴포넌트를 따로 만들어서 관리하는 것이 좋다.

그런데 서버 컴포넌트와 클라이언트 컴포넌트에서 queryClient를 호출하는 방식이 다르다.

클라이언트에서 쿼리 호출용

'use client';

import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { ReactNode, useState } from 'react';

interface QueryProviderProps {
  children: ReactNode;
}

export const QueryProvider = ({ children }: QueryProviderProps) => {
  const [queryClient] = useState(
    () =>
      new QueryClient({
        defaultOptions: {
          queries: {
            refetchOnWindowFocus: false,
            retry: 1,
            staleTime: 1000 * 60 * 5,
          },
        },
      }),
  );

  return <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>;
};

이 provider로 전체를 감싸주면, 이 Next.js 프로젝트 안의 클라이언트 컴포넌트에서는 일일히 queryClient를 직접 만들 필요가 없다.

이 provider는 useState를 사용하기 때문에 서버전용 provider는 만들 수 없다. 

서버 컴포넌트에서 쿼리 호출용

import { QueryClient } from '@tanstack/react-query';
import { cache } from 'react';

export const getServerQueryClient = cache(
  () =>
    new QueryClient({
      defaultOptions: {
        queries: {
          staleTime: 60 * 1000,
          gcTime: 5 * 60 * 1000,
        },
      },
    }),
);

 

export default async function MyPage() {
  const queryClient = getServerQueryClient();
  const dehydratedState = dehydrate(queryClient);

  return (
    <HydrationBoundary state={dehydratedState}>
    ...

 

 

그래서 SSR 환경에서 prefetchQuery를 사용할 경우엔 위 컴포넌트가 추가적으로 있어야한다.

클라이언트용과 다른 점은 react의 cache 함수를 이용한다는 것이다.

그럼 여기서 cache의 기능은 무엇일까?

1. 요청별로 범위가 지정되어 사용자 간 데이터 격리 보장
2. 동일한 요청 내에서는 항상 같은 QueryClient 인스턴스 사용
3. 요청당 하나의 QueryClient만 생성되어 메모리 효율성 증가

그럼 클라이언트에서는?

React의 상태 관리 메커니즘을 통해 컴포넌트 라이프사이클 동안 QueryClient 인스턴스를 유지하기 때문에 cache를 사용할 필요가 없다.

저작자표시 비영리 변경금지 (새창열림)

'Next.js' 카테고리의 다른 글

[Next.js] SSR 환경에서의 데이터 공유(캐싱, 전역 상태 관리)  (0) 2025.04.20
[Next.js] 프로젝트 초기 세팅을 해보자!  (0) 2025.04.06
React는 라이브러리, Next.js는 프레임워크?  (0) 2025.03.23
[리팩토링]Next.js 프로젝트 리팩토링 기록 정리  (0) 2025.02.27
'Next.js' 카테고리의 다른 글
  • [Next.js] SSR 환경에서의 데이터 공유(캐싱, 전역 상태 관리)
  • [Next.js] 프로젝트 초기 세팅을 해보자!
  • React는 라이브러리, Next.js는 프레임워크?
  • [리팩토링]Next.js 프로젝트 리팩토링 기록 정리
버그잡는고양이발
버그잡는고양이발
주니어 개발자입니다!
  • 버그잡는고양이발
    지극히평범한개발블로그
    버그잡는고양이발
  • 전체
    오늘
    어제
    • 분류 전체보기 (382)
      • React (16)
      • Next.js (5)
      • Javascript (5)
      • Typescript (4)
      • Node.js (2)
      • Cs (16)
      • 트러블 슈팅 (5)
      • Html (1)
      • Css (3)
      • Django (0)
      • vue (0)
      • Java (2)
      • Python (0)
      • 독서 (1)
      • 기타 (3)
      • 백준 (192)
      • swea (31)
      • 프로그래머스 (30)
      • 이코테 (4)
      • 99클럽 코테 스터디 (30)
      • ssafy (31)
      • IT기사 (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 인기 글

  • 태그

    개발자취업
    코딩테스트준비
    항해99
    Til
    99클럽
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
버그잡는고양이발
[Next.js & React-Query] 서버 컴포넌트에서 QueryClient 호출하기
상단으로

티스토리툴바