전역에서 상태를 관리하는 Redux는 캐싱하는 개념이다.
그러나 정말 클라이언트(리액트)에서 수행하는 상태 관리로도 충분할까? No No
위와 같은 작업을 수행해주는 라이브러리이다.
stale
과 CacheTime
에 대하여 알 필요성이 있다.데이터를 refetch(재요청)하는 주기를 판단해주는 개념인 stale과 fresh이다.
fresh
- 데이터를 받아온 직후로 가장 데이터가 신선한 상태를 의미한다. fresh 상태일 경우엔 새롭게 mount 되어도 네트워크 요청이 일어나지 않는다. 그래서staletime
을 지정해야 한다.
stale
- 신선하지 않은, 즉, 낡은 데이터를 의미하므로 refetch가 이루어짐을 알린다.
staleTime
- 기본 값은 0이며, 이는 받아옴과 동시에 낡은 데이터이므로 캐싱 데이터와 상관없이 계속해서 fetch를 한다. 즉, 서버의 부담이 늘지만 데이터 구조가 자주 바뀌는 경우엔 지정해주지 않으면 된다.
cacheTime
- 데이터가inactive
상태일 때, 캐싱된 상태로 남아있는 시간. 기본 값은 5분이다. 쿼리 인스턴스가 unmount되면 데이터는inactive
상태로 변경되고cacheTime
만큼 유지된다.
cacheTime
이 지나면 가비지 콜렉터로 수집된다.
cacheTime
이 지나기 전에 다시 쿼리 인스턴스가 마운트되면, 데이터를 fetch하는 사이에 캐시 데이터를 보여준다.
cacheTime
은staleTime
이 아무리 길어도(임시로 보관해도)inactive
된 시점을 기준으로 데이터를 삭제하는 시점을 결정한다. 즉,cacheTime
이 짧으면 데이터는 어차피 사라진다.
inactive
는 스크린에서 사용되지 않는 데이터임을 의미한다.
cacheTime
은 말 그대로신선한
데이터를 유지한다. 즉, 디폴트로staleTime
과cacheTime
을 사용하면, 캐싱이 되지 않는다.
enabled:false
로 설정하면 fetch 실패시 계속해서 retry
하는 행위를 차단한다.
refetch
함수는 캐싱 결과와 무관하게 ajax요청을 날린다. 이미 해당 키 값이 QueryClient 객체에 저장되어 있어도 무시하고 재요청을 보낸다.
enabled:true
상태여야만 한다.import { useQuery } from 'react-query'
function App() {
//인자 1: 쿼리 키, 인자 2: 쿼리 함수(fetch, axios 요청)
const info = useQuery('todos', fetchTodoList)
}
Query Key
- 이 데이터를 관리할 키 값 (위의 데이터는 todos
키에 대한 데이터)Array
로 저장해 ['todos', 1]
처럼 저장해서 페이지네이션에도 활용이 가능함.useQuery
의 반환값data
: 요청에 성공한 데이터error
: 에러 반환 객체isFetching
: 요청 중일 때, true
status, isLoading, isSuccess
등의 현재 query 상태refetch
: 해당 쿼리를 refetch하는 함수remove
: 해당 쿼리를 캐시에서 지우는 함수useQuery
의 옵션onSuccess onError, onSettled
등 성공 실패 완료 시 실행할 Side Effect 정의enabled
: 자동으로 query 실행할지 여부retry
: query 실패 시, 자동으로 retry
할건지 여부select
성공 시 가져온 data를 가공해서 전달keepPreviousData
: 새롭게 fetching 시 이전 데이터 유지 여부refetchInterval
: 주기적으로 refetch 할지 여부