Closed hyeyoonS closed 1 month ago
cacheTime : 메모리에 얼마만큼 있을 것인지, 해당 시간 이후에는 GC( Garbage collector )에 의해 처리가 되며 default 값은 5분입니다.
staleTime : 얼마의 시간이 흐른 후에 데이터를 stale( 신선하지 않은 -> 최신 상태가 아닌 ) 취급할 것인지에 해당하는 옵션입니다.
React Query는 서버 상태 관리 라이브러리로, 데이터 페칭, 캐싱, 동기화 및 서버 상태 업데이트를 간편하게 처리할 수 있게 해줍니다.
Stale Time은 React Query에서 데이터를 '신선한'(fresh) 상태로 간주하는 시간입니다. 즉, 데이터가 서버에서 마지막으로 가져온 이후로 지정된 시간 동안 신선하다고 간주되며, 이 기간 동안에는 재요청을 하지 않습니다.
0
으로 설정되어 있으며, 이는 데이터가 바로 오래된(stale) 상태로 간주된다는 것을 의미합니다.staleTime: 10000
(10초 동안 데이터가 신선한 상태로 간주됨).const { data } = useQuery('todos', fetchTodos, {
staleTime: 10000, // 10초 동안 데이터가 신선하다고 간주됩니다.
});
GC 타임은 캐시에 저장된 데이터가 메모리에서 제거될 때까지의 시간을 의미합니다. 이 시간 동안 사용되지 않은 데이터는 자동으로 가비지 컬렉션(GC)되어 메모리에서 해제됩니다.
5분(300000ms)
으로 설정되어 있습니다.cacheTime: 600000
(10분 동안 데이터가 캐시에 유지됨).const { data } = useQuery('todos', fetchTodos, {
cacheTime: 600000, // 10분 동안 캐시에 데이터가 유지됩니다.
});
📎 질문
(1) ReactQuery의 GC 타임, stale time에 대해서 설명해주세요. (2) prefetchQuery를 사용한 경험이 있나요?
✏ 구술 답변 키워드
(1) Stale Time
Garbage Collection Time
(2) prefetchQuery가 뭔가요?
prefetchQuery를 사용하면 좋은 예시?
✏ 서술 답변
(1) ReactQuery의 GC 타임, stale time에 대해서 설명해주세요.
gcTime과 staleTime의 플로우 예시!
gcTime
은 기본값 5분,staleTime
은 기본값 0초를 가정합니다.A
라는 queryKey를 가진 A 쿼리 인스턴스가mount
캐싱
함fresh
상태에서staleTime(기본값 0)
이후stale
상태로 변경됨unmount
됨gcTime(기본값 5min)
만큼 유지되다가가비지 콜렉터(GC)
로 수집됨staleTime과 gcTime
썩은
이라는 의미이다. 즉, 최신 상태가 아니라는 의미이다.신선한
이라는 의미이다. 즉, 최신 상태라는 의미이다.1. staleTime:
(number | Infinity)
2. gcTime:
(number | Infinity)
(2) prefetchQuery를 사용한 경험에 대해서 알려주세요.
1. prefetchQuery가 뭐지?
Prefetching은 데이터가 실제로 필요하기 전에 사전에 데이터를 가져오고 캐시에 저장하는 프로세스를 말합니다. 데이터가 실제로 필요한 시점에 미리 캐시에 데이터가 존재하도록 해서, 페이지 로딩 속도를 높이고 유저 경험을 향상시킬수 있습니다.
react query에서는
queryClient.prefetchQuery
을 통해서 손쉬운 prefetch 기능을 제공합니다짚고 넘어가야 할 것 : prefetch를 하는 방법은
queryClient.prefetchQuery
가 유일하지 않다! 예시: 함수의 생명주기 안에서 데이터를 차례대로 로드해야할 때 --- 쿼리를 사용하고 결과를 무시하기2. prefetchQuery의 동작 방식
dehydrate
로 캐시된 상태를 JSON으로 직렬화하여 HTML과 함께 클라이언트로 전달합니다.HydrationBoundary
를 사용하여 직렬화된 상태를 복원(hydrate)하고, 동일한 캐시를 사용합니다.3. 마이펫로그 예시코드
1)
차단한 유저 목록
에 접근할 때2) 다이어리 목록에서 다이어리 상세 내용에 접근할 때
4. 🧐PrefetchQuery 언제 사용하면 좋지?
⇒ 유저가 B에 접근하는 순간, 혹은 C로 가는 링크컴포넌트에 마우스를 올린 순간!! 데이터를 미리 가져오면 C에서는 초기 로딩 시간을 단축할 수 있고 유저 경험 향상 可
⇒ Prefetch는 확률 게임이라고 할 수 있다…? B에서 C-1, C-2, C-3, C-4, C-5… C-16으로 갈 수 있는 선택지가 있다면..? 모든 데이터를 prefetch 할 필요가 없다 (당연,, 그럼 결국 그냥 다 서버에서 받아오는거잖아…~)
⇒ C는 아주 인기가 없는 컴포넌트여서 접근 확률이 아주아주 낮은데, A에 있는 유저가 만약 C에 접근하려면 반드시 B를 거쳐서 A → B → C 로만 접근해야 한다면..? 굳이 데이터를 캐시에 저장해둘 필요가 있을까? (→ 굳이? 그럴 필요 없다) 자주 사용하는 데이터를 prefetch하면 좋지만, 인기있는 데이터가 아니라고 해서 꼭 지양해야 하는 것은 아님 (하고 싶으면 하면 됨,, 일단 SSR이전에 데이터를 받아오기 때문에 UX향상)
5. 🧐PrefetchQuery 언제 사용하면 별로지?
prefetch 하려는 데이터가 캐러셀 + 무한스크롤 …. 등등 아주 동적인 데이터인 경우
(cf. 무한스크롤, 페이지네이션을 위한
prefetchInfiniteQuery
가 별도로 존재함)