노트

staleTime과 gcTime

staleTime and gcTime

프런트엔드#react#performance · 연결된 개념 4개

쉽게 말하면

staleTime은 '이 반찬을 얼마 동안 다시 안 사도 되나', gcTime은 '아무도 안 먹는 반찬을 언제 버리나'를 정하는 손잡이예요. 냉장고에서 신선도와 공간을 따로 관리하는 셈이죠.

비유가 깨지는 곳 냉장고와 달리 stale이 돼도 바로 버리지 않고 먼저 보여 주고 백그라운드에서 다시 받아요. gcTime 시계도 stale 이후가 아니라 쓰는 컴포넌트가 0개인 inactive가 된 뒤부터 돌아요.

TanStack Query에서 staleTime은 받아 온 데이터를 얼마 동안 신선하다고 볼지(다시 요청할지)를, gcTime(Garbage Collection Time)은 아무도 쓰지 않는 캐시를 얼마 동안 메모리에 둘지(언제 지울지)를 정한다. 같은 캐시에 대한 서로 다른 두 손잡이다.

staleTimegcTime
관심사신선도 → 재요청 여부메모리 → 캐시 삭제
시계가 도는 때데이터를 받은 직후부터쿼리가 inactive(구독 컴포넌트 0개)가 된 뒤부터
기본값0(받자마자 stale)5분
stateDiagram-v2
  state "fresh" as F
  state "stale (캐시엔 있음)" as S
  state "inactive (구독 컴포넌트 0개)" as I
  [*] --> F: 마운트 → fetch
  F --> S: staleTime 경과
  S --> F: 트리거 시 백그라운드 재요청
  F --> I: 언마운트
  S --> I: 언마운트
  I --> [*]: gcTime 경과 → 캐시에서 삭제
  • fresh한 동안에는 재마운트나 창 포커스가 와도 요청하지 않는다. 기본값 0은 "왜 안 바뀌지?"보다 "항상 갱신"이 낫다는 판단이다
  • 이름: v4까지 cacheTime이었고 v5에서 gcTime으로 바뀌었다. 그리고 gcTime은 stale이 된 뒤가 아니라 inactive가 된 뒤 시작된다
  • 실무에서 주로 만지는 것은 staleTime이다. 잘 안 바뀌는 데이터(카테고리, 설정)는 길게 잡는다
  • gcTime을 만지는 경우
    • 한참 뒤 돌아와도 즉시 이전 화면을 보여 주고 싶을 때(길게)
    • 데이터가 크거나 다시 볼 일이 없을 때(짧게)
    • 민감한 데이터를 화면을 떠나면 바로 지우고 싶을 때(0)
    • 캐시를 localStorage 등에 영속화할 때(길게)
  • staleTime이 gcTime보다 길면 의미가 줄어든다. 아직 fresh인데 캐시가 지워져 버릴 수 있어서 보통 gcTime ≥ staleTime으로 둔다

HTTP(HyperText Transfer Protocol) 쪽의 같은 아이디어는 브라우저 캐시의 max-age·stale-while-revalidate, ISR(Incremental Static Regeneration)의 재생성 주기(CSR·SSR·SSG·ISR)다. 전체 흐름은 TanStack Query.

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 최종 일관성

    최종 일관성(eventual consistency)은 "지금 당장은 저장소마다 값이 다를 수 있지만, 새 변경이 멈추면 결국 같아진다"는 보장이다. 원본 DB와 검색 색인·캐시·다른 서비스처럼 물리적으로 분리된 저장소를 한 트랜잭션으로 묶을 수 없을 때 받아들이는 일관성 모델(consistency model)이다.

  • LRU 캐시와 캐시 계층 비교

    LRU(Least Recently Used) 캐시는 크기를 정해 두고, 가득 차면 가장 오랫동안 쓰지 않은 항목부터 버리는 메모리 캐시다. Node.js에서는 lru-cache 패키지가 대표적이다. 자주 쓰는 데이터는 계속 남고 안 쓰는 것만 밀려난다.

  • 운영 Node 프로세스의 메모리 누수 찾기

    살아 있는 Node 서버에 inspector를 붙이고, 힙 스냅샷 두 장을 비교해 무엇이 쌓이는지, retainer로 누가 붙잡고 있는지 찾는 절차.

  • localStorage와 sessionStorage

    브라우저에 문자열 키-값을 저장하는 Web Storage API의 두 가지. 쿠키와 달리 요청에 자동으로 실리지 않고, 출처 단위로 나뉘며(same-origin-policy), 보통 출처당 5MB 안팎을 쓸 수 있다. 동기 API라 큰 데이터를 자주 읽고 쓰면 메인 스레드를 막는다.

  • Redis (인메모리 저장소)

    Redis는 데이터를 메모리에 두는 키-값 저장소(key-value store)다. 디스크 기반 DB보다 훨씬 빠르지만, 기본적으로 휘발성에 가깝게 다루는 것이 안전하다. 문자열뿐 아니라 리스트·해시·셋·정렬된 셋 같은 자료구조를 명령 하나로 다룬다.

보기 옵션