[Uket] staleTime, gcTime과 refetchOnMount의 비밀

refetchOnMount의 동작 방식

coggiee
1 min readNov 8, 2024

공식 문서에 따르면,

refetchOnMount의 값이 false라면, 컴포넌트가 마운트 됐을 때 리페칭을 하지 않는다고 한다.

마치 이 문장은 "false 일 때는 무조건 리페칭을 하지 않는다” 라고 말하는 것 같다.

비밀? 함정? 나만 몰랐을 수도

하지만, 이는 쿼리의 상태와 gcTime에 따라 달라진다.

먼저, staleTime: 3000, gcTime: 5000, refetchOnMount: false 으로 설정했다.

쿼리는 처음에 fresh하다가 3초가 지나면 stale 상태가 된다.

이때 컴포넌트를 언마운트하고 gcTime 이 지나기 전에 다시 마운트하면, 쿼리는 여전히 stale 함을 볼 수 있다.

그렇다면, gcTime 이 지나고 나서 마운트 한다면 어떻게 될까?

컴포넌트가 언마운트되면 쿼리가 inactive상태가 되며, 이때부터 gcTime 의 측정이 시작되고 5초가 지나면 쿼리는 메모리에서 제거된다.

이때 컴포넌트를 다시 마운트하면, 쿼리의 상태가 아래와 같이 변경된다.

fetching -> fresh -> staleTime(3초) 지남 -> stale

즉, refetchOnMount: false 임에도 불구하고 자동으로 리페칭이 일어난다.

결론은, 쿼리가 inactive 상태가 된 후 메모리에서 삭제가 되면 해당 쿼리를 다시 사용하고자 할 때 반드시 리페칭이 발생한다.

+) 추가

gcTime 을 “데이터(쿼리)가 오래된(stale) 상태가 된 이후에 측정되는 시간” 이라고 설명하는 글이 많다.

이는 틀린 말이며, 정확하게는 “데이터(쿼리)가 사용되지 않는 상황(inactive)이 된 이후에 측정되는 시간”이다. (사용되지 않는 상황은 쿼리를 구독하고 있는 컴포넌트가 사라지거나 언마운트 될 때를 의미한다.)

만약, 데이터(쿼리)가 오래된 상태가 된 이후에 측정되는 시간이라면, 위 코드에서 데이터(쿼리)가 stale 상태가 된 이후에 5초가 지나면 메모리에서 사라져야 하지만 그렇지 않음을 볼 수 있다.

--

--

coggiee
coggiee

Written by coggiee

0 Followers

Just doing

No responses yet