본문 바로가기
Clone Coding

Jira Clone - Hono + TanStack React Query 설정

by zzuny-code 2025. 9. 16.
반응형

패키지 설치

bun add @tanstack/react-query@5.59.0

 

QueryProvider 설정

src/
└── app/
└── component/
    └── ui/
    └── dottedSeparator.tsx
    └── query-provider.tsx
'use client'

import {
  isServer,
  QueryClient,
  QueryClientProvider,
} from '@tanstack/react-query'

function makeQueryClient() {
  return new QueryClient({
    defaultOptions: {
      queries: {
        staleTime: 60 * 1000,
      },
    },
  })
}


// 브라우저에서 사용할 QueryClient 인스턴스 (싱글톤)
let browserQueryClient: QueryClient | undefined = undefined

function getQueryClient() {
  if (isServer) {
    return makeQueryClient()
  } else {
    if (!browserQueryClient) browserQueryClient = makeQueryClient()
    return browserQueryClient
  }
}

// export default function Providers({ children }: { children: React.ReactNode }) {
//   const queryClient = getQueryClient()

//   return (
//     <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
//   )
// }

interface QeuryProviderProps{
    children: React.ReactNode;
}

export const QueryProvider = ({ children }: QeuryProviderProps) => {
  const queryClient = getQueryClient()

  return (
    <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
  )
}

 

Layout에서 Provider 적용

src/app/layout.tsx

  • 전체 layout에서 감싸줌(쿼리준비 완료)
<html lang="en">
  <body className={cn(inter.className, "antialiased min-h-screen")}>
    <QueryProvider>
	  {children}
    </QueryProvider>
  </body>
</html>

 



서버와 클라이언트 분리의 중요성

// ❌ 잘못된 방법: 서버와 클라이언트에서 같은 인스턴스 공유
const queryClient = new QueryClient()

// ✅ 올바른 방법: 환경별 적절한 인스턴스 생성
function getQueryClient() {
  if (isServer) {
    return makeQueryClient() // 서버: 매번 새로운 인스턴스
  } else {
    if (!browserQueryClient) browserQueryClient = makeQueryClient()
    return browserQueryClient // 브라우저: 싱글톤
  }
}

 

  • 서버 사이드: 각 요청은 독립적이어야 하므로 매번 새로운 QueryClient 생성
  • 클라이언트 사이드: 앱 전체에서 캐시를 공유해야 하므로 싱글톤 패턴 사용
  • 메모리 누수 방지: 서버에서 인스턴스 재사용 시 이전 요청 데이터가 남을 수 있음

 

반응형