티스토리 뷰

React

Tanstack Query 의 캐싱에 대하여

developer jungminji 2024. 11. 7. 00:01

Tanstack Query 는 캐싱을 제공한다. 공식 문서에 useQuery 훅을 사용하여 데이터 캐싱과 관리 방법을 간단한 예시로 설명하고 있어서 정리해 보았다.

 

예시 

  • useQuery 훅을 통해 ['todos'] 쿼리 키를 사용하는 쿼리를 실행
  • fetchTodos 함수로 네트워크 요청을 통한 데이터 받기
  • gcTime 은 5분, staleTime 는 0초로 설정

위의 조건대로 기본 상황을 설정하였으며, 해당 조건을 토대로 캐싱이 어떻게 이루어지고 데이터가 삭제되는 과정을 알아보자.

 

단계별 설명

1. 처음 실행

  • useQuery({ queryKey: ['todos'], queryFn: fetchTodos }) 을 처음 호출하면 아직 캐시된 데이터가 없다. 그러므로 로딩 상태를 보여주고 네트워크로 요청을 보낸다. 이때 제공되는 isLoading 로 로딩 중임을 표시해 주면 된다.
  • 네트워크 요청이 완료되면 가져온 데이터를 'todos' 라는 키로 캐시된다. 
  • staleTime 가 0으로 설정되어 있으므로, 데이터를 가져온 직후에 stale 상태가 된다. 

2. 두 번째 실행 

두 번째는 캐시된 데이터가 있는 상태에서 다시 같은 요청을 할 때의 설명이다. 

  • 다른 곳에서 useQuery({ queryKey: ['todos'], queryFn: fetchTodos }) 을 다시 호출하면 'todos' 키로 캐시된 데이터를 즉시 불러온다.
  • 이후이도 계속 fetchTodos 함수를 실행해도 캐시된 데이터를 먼저 반환하고 staleTime 이 0초 이므로 백그라운드에서 최신 데이터를 가져온다.

3. 언마운트

  • useQuery({ queryKey: ['todos'], queryFn: fetchTodos })를 사용하여 데이터를 가져오던 모든 컴포넌트가 언마운트되면 해당 쿼리가 더이상 사용되지 않는 상태가 된다.
  • 이때 gcTime 5분으로 설정되어 있으므로, 5분 동안 데이터를 캐시하고 이후에는 삭제된다. 중요한 점은 gcTime 은 요청 직후 흘러가는 것이 아닌, 쿼리가 비활성 상태가 되면 그때부터 흐르게 되는 것이다.

 

4. 캐시 만료 전 새로운 쿼리 실행

  • 캐시 만료 시간인 5분이 지나기 전에 또 같은 useQuery({ queryKey: ['todos'], queryFn: fetchTodos }) 쿼리를 다시 호출하면, 캬사애 있던 데이터를 먼저 사용하고 fetchTodos 함수를 백그라운드에서 실행하여 최신 데이터를 가져온다. 
  • 캐시 시간이 5분인데 왜 요청을 또 하느냐? 그 이유는 캐시는 5분으로 설정했지만 staleTime 은 0초 이므로 캐시된 데이터가 이미 오래된 데이터로 간주하기 때문이다. 
  • 새로운 데이터가 받아지면 캐시와 화면의 데이터가 다시 최신 상태로 업데이트된다.

 

참고 자료

제가 공부한 내용은 아래 문서에서 확인할 수 이며, 해당 문서 내용 기반으로 정리한 글입니다.

https://tanstack.com/query/v5/docs/framework/react/guides/caching

 

TanStack | High Quality Open-Source Software for Web Developers

Headless, type-safe, powerful utilities for complex workflows like Data Management, Data Visualization, Charts, Tables, and UI Components.

tanstack.com


잘못된 정보가 있다면 지적부탁드립니다. 🥺

 

'React' 카테고리의 다른 글

React 에서 Sweetalert2 사용  (1) 2024.08.26
[React] 투두 리스트 만들기  (0) 2024.08.23
[React] React 에 컴포넌트 별로 CSS 적용하기  (0) 2024.08.12
최근에 올라온 글
Total
Today
Yesterday
링크