본문 바로가기

TanStack Query

[TanStack Query / React Query] staleTime과 gcTime 이해하기: 데이터 캐싱

1. stale data

 

  • 데이터의 사용 기간이 지났고, 다시 가져올 준비가(refetch) 되 있는 상태입니다
  • 여전히 데이터는 캐시 안에 있습니다
    • 데이터를 다시 검증해야 한다는 뜻
  • 데이터 새로 고침(refetch) 은 오래된 데이터( stale data )에 대해서만 트리거됩니다
    • 자동으로 데이터 새로 고침을 하는 트리거는 컴포넌트 remount 나 브라우져 창의 refocus가 있습니다
    • staleTime 은 데이터의 최대 수명이라고 생각하면 됩니다
    • 그러므로 데이터 새로고침 기능을 컨트롤하고 싶다면 이와 관련된 useQuery 의 옵션 중 하나인 staleTime 을
      조절하면 됩니다
      (staleTime 이 2초 (2000 ms) 라면 2초 동안에는 데이터 새로 고침이 되지 않습니다
    • staleTime 은 default 로 0ms 이기 때문에 추가로 조절을 하지 않으면 오토 refetch 트리거가 발동되면서 
      항상 데이터 새로고침을 하게 됩니다
  const { data, isLoading, isError, error } = useQuery({
    queryKey: ["posts"],
    queryFn: fetchPosts,
    staleTime: 1000 * 2,
  });

 

위 코드처럼 staleTime  옵션 값을 주게 되면 아래 그림처럼 데이터의 상태가

Fresh -> Stale 로 변하는 모습을 확인할 수 있습니다.

 

staleTime  옵션을 별도로 주지 않으면 staleTime : 0 이 기본값이므로 새로 불러온 데이터는 바로 stale 상태가 됩니다.

 

react-query-devtools 로 확인 가능합니다.

 

 

2. gcTime

  • useQuery 가 비활성화 상태이고, 데이터가 현재 페이지에 표시되지 않으면  쿼리는 cold storage 상태로 들어갑니다
    • 쿼리가 캐시에는 있으나 사용되지 않는 유효기간이 정해진 상태입니다.
  • 캐시 데이터는 gcTime 이후 사라집니다. (기본값 : 5분)
    • 데이터가 페이지에 표시된 이후부터 시간이 측정됩니다.
      ( 정확히는 데이터가 추가로 사용되지 않으면)
  • gc 처리된 데이터는 리액트 쿼리에서 더이상 사용할 수 없습니다

 

 

3. staleTime VS gcTime ( garbage collect Time )

 

staleTime : 데이터를 다시 가져와야 할 때를 알려준다

gcTime : 나중에 재사용할 수 있는 데이터의  캐시 보관 기간

 

3-1) staleTimegcTime 에 따른 작동 방법

 

  1. data 상태가 Fresh , 캐시에 데이터가 있을 때
    캐시 데이터를 보여주고 refetch 는 일어나지 않습니다

  2. data 상태가 Stale, 캐시에 데이터가 있을 때
    먼저 캐시 데이터를 보여주고 refetch 후, 새로운 데이터를 보여줍니다

  3. 캐시에 데이터가 없을 때
    refetch 하는 동안, 화면에는 아무 데이터도 보여주지 않습니다. 
    로딩 바나 스피너 가 있다면 화면에 이것들이 보이게 될겁니다.

3-2) 그러므로 gcTime 을 설정할 때는 항상 staleTime 이상의 값으로 설정 해줘야 합니다

캐시 데이터가 없으면 데이터가 없는 빈 화면을 노출하게 되어 사용자 경험이 떨어지게 됩니다