TanStack Query의 gcTime과 staleTime 비교

2025. 12. 30. 15:17·React

TanStack Query(React Query)에서 gcTime과 staleTime은 캐싱 전략을 제어하는 서로 다른 목적을 가진 옵션입니다.

사용할 때마다 헷갈리는 두 개념 정리해보겠습니다.

staleTime (신선도 시간)

데이터가 "신선한(fresh)" 상태로 유지되는 시간을 의미합니다.

  • 기본값: 0 (즉시 stale 상태가 됨)
  • 역할: 이 시간 동안은 데이터가 fresh 상태로 간주되어, 같은 쿼리를 다시 호출해도 네트워크 요청을 하지 않고 캐시된 데이터를 반환합니다.
  • 사용 예시: 자주 변경되지 않는 데이터(예: 사용자 프로필, 설정값)는 staleTime을 길게 설정
const { data } = useQuery({
  queryKey: ['user', userId],
  queryFn: fetchUser,
  staleTime: 5 * 60 * 1000, // 5분 동안 fresh 상태 유지
});

gcTime (가비지 컬렉션 시간)

사용되지 않는 캐시 데이터가 메모리에서 제거되기까지의 시간입니다.

  • 기본값: 5분 (300,000ms)
  • 이전 이름: cacheTime (v5에서 gcTime으로 변경됨)
  • 역할: 쿼리가 더 이상 활성 observer가 없을 때(언마운트 등), 이 시간 동안 캐시를 메모리에 보관합니다. 이 시간이 지나면 가비지 컬렉션 대상이 됩니다.
  • 사용 예시: 사용자가 페이지를 왔다갔다 할 때 빠른 재접근을 위해 캐시 유지
const { data } = useQuery({
  queryKey: ['posts'],
  queryFn: fetchPosts,
  gcTime: 10 * 60 * 1000, // 10분 동안 캐시 유지
});

주요 차이점

구분 staleTime gcTime
목적 데이터 신선도 판단 메모리 관리
영향 리페칭 여부 결정 캐시 삭제 시점 결정
기본값 0ms 5분
측정 시작 데이터 fetch 시점부터 마지막 observer 제거 시점부터(언마운트 시점)

실전 사용 패턴

// 1. 거의 변하지 않는 정적 데이터
const { data: categories } = useQuery({
  queryKey: ['categories'],
  queryFn: fetchCategories,
  staleTime: Infinity, // 절대 stale 상태가 되지 않음
  gcTime: 10 * 60 * 1000, // 10분간 캐시 보관
});

// 2. 실시간성이 중요한 데이터
const { data: notifications } = useQuery({
  queryKey: ['notifications'],
  queryFn: fetchNotifications,
  staleTime: 0, // 항상 stale (기본값)
  gcTime: 0, // 즉시 삭제
});

// 3. 균형잡힌 설정
const { data: posts } = useQuery({
  queryKey: ['posts'],
  queryFn: fetchPosts,
  staleTime: 30 * 1000, // 30초간 fresh
  gcTime: 5 * 60 * 1000, // 5분간 캐시 유지
});

일반적으로 staleTime ≤ gcTime 관계를 유지하는 것이 좋습니다.
staleTime이 gcTime보다 크면 데이터가 fresh 상태인데 캐시에서 삭제되는 비효율이 발생할 수 있습니다.

상태가 fresh인데 캐시가 없는경우 다시 refetch해야합니다.

체크 순서

페이지 마운트
↓
[1] 캐시 있음?
↓ YES
[2] fresh 상태? (staleTime 체크)
↓ NO (stale)
[3] 캐시 데이터 즉시 반환
↓
[4] 백그라운드 리페칭 시작
↓
[5] 새 데이터 도착 시 업데이트

결과

stale 상태여도 캐시가 있으면 캐시데이터를 즉시 보여주고(UX 좋음) + 뒤에서 업데이트(데이터 최신성 유지)하는 것이 TanStack Query의 강력한 장점입니다!

'React' 카테고리의 다른 글

react-query resetQueries, removeQueries  (0) 2023.12.05
react tailwind setting, config  (0) 2023.10.29
getInitialProps로 header정보 넘기기  (0) 2023.10.26
React Query Promise.all, useQueries  (0) 2023.09.15
react 프로젝트에서 import순서 정렬  (0) 2023.09.08
'React' 카테고리의 다른 글
  • react-query resetQueries, removeQueries
  • react tailwind setting, config
  • getInitialProps로 header정보 넘기기
  • React Query Promise.all, useQueries
ssund
ssund
  • ssund
    ssund의 기술블로그
    ssund
  • 전체
    오늘
    어제
    • TECH (82)
      • Next.js (8)
      • React (25)
      • Vite (1)
      • javascript (17)
      • CSS (6)
      • CS (10)
      • AWS (0)
      • Jest (1)
      • CI|CD (0)
      • 알고리즘 (8)
      • Tools (1)
      • Tips (5)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      reat-head
      함수와 메서드차이
      TypeScript
      JavaScript
      redux
      call signatures
      커머스프로젝트
      React
      타입스크립트
      styled-components
      git배포
      global-style
      theme-provider
      Array.sort()
      react state management
      웹브라우저구성
      app-router
      서버컴포넌트
      배열요소순서
      nextjs
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.0
    ssund
    TanStack Query의 gcTime과 staleTime 비교
    상단으로

    티스토리툴바