먼저, 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초가 지나면 메모리에서 사라져야 하지만 그렇지 않음을 볼 수 있다.