Tanstack Query 공식 문서
웹 애플리케이션에서 서버 상태를 패칭, 캐싱, 동기화 및 업데이트 하는 작업을 아주 쉽게 해준다.
간편한 데이터 관리
데이터 가져오기, 캐싱, 동기화, 업데이트 처리를 간편하게 할 수 있게 해준다.
실시간 업데이트 및 동기화
실시간 데이터 업데이트와 자동 동기화를 지원하여 서버와 클라이언트 데이터의 일관성을 유지한다.
데이터 캐싱
데이터를 캐싱하여 불필요한 API 요청을 줄이고 애플리케이션의 성능을 향상시킨다.
서버 상태 관리
서버 상태관리 (로딩중, 에러 성공 등의 상태)를 간편하게 처리할 수 있다.
Fetching 코드 작성const getData = async () => {
const data = await fetch("http://naver.com/user/saebom")
.then((response) => response.json());
return data;
}
const [data, setData] = useState();
useEffect를 이용해 컴포넌트 마운트 시 데이터 Fetching 후 상태 저장useEffect를 많이 사용하기 때문에 발생할 수 있는 side effect로 인해 코드의 흐름 파악이 어려움useEffect(()=> {
getData()
.then((res) => setState(res))
.catch((err) => {
console.log(err.response.data)
});
}, []);
Fetching 코드 작성const getData = async () => {
const data = await fetch("http://naver.com/user/saebom")
.then((response) => response.json());
return data;
}
Fetching 및 상태 저장useEffect 사용 안하므로 코드 흐름 파악하기 쉬움const { data } = useQuery(["data"], setData);
데이터를 가져오고 캐싱한다.
GET으로 받아오는 대부분의 API에서 useQuery() 함수를 사용한다.
const { data } = useQuery(
queryKey,
queryFunction,
options,
)
Unique Key - 응답 데이터를 캐싱할 때 사용된다.Promise 를 반환하는 함수 - 쿼리 요청을 수행하기 위한 fetch, axiosuseQuery에 사용되는 옵션을 지정하는 객체데이터를 업데이트하고 캐시를 업데이트 할 수 있다.
데이터 생성, 수정, 삭제 용으로 사용되며, POST, PUT, DELETE 요청시에 사용한다.
const { mutate } = useMutation(
mutationFn,
options,
);
Promise를 반환하는 함수 - fetch, axios useMutation에 사용되는 옵션을 지정하는 객체캐싱을 활용하여 불필요한 API 호출을 줄임으로써 전체적인 애플리케이션 성능을 향상 시킬 수 있다!!
캐시된 데이터의 유효 기간을 나타내는 옵션
호출한 데이터는 리액트 쿼리 자체적으로 저장하는데, staletime의 기본 값은 0으로 설정되어 있어, 데이터가 한번 캐시되면 즉시 만료되고 다시 요청된다.
이 값을 조정해서 데이터를 일정 시간 동안 캐시로 사용하고, 그 이후에만 다시 요청하도록 할 수 있다.
➡️ 데이터의 유통기한 !!
자주 변경되지 않는 데이터의 경우 캐시된 데이터를 사용함으로써 불필요한 네트워크 요청을 줄이고, 애플리케이션의 성능을 향상시킬 수 있다.
const { data } = useQuery(['data', getServerData,{
staletime: 10 * 60 * 1000;
})
cachetime은 캐시된 데이터가 얼마나 오랫동안 메모리에 유지될지를 나타내는 옵션
이 값을 설정하면 캐시된 데이터가 일정 시간 동안 메모리에 유지된 후 자동으로 삭제된다.
데이터가 일정 기간 동안 메모리에 남아 있게 함으로써 같은 데이터를 다시 요청할 때 캐시에서 가져오기 때문에 성능을 향상 시킬 수 있다.
const { data } = useQuery(['data', getServerData], {
cachetime: 30 * 60 * 1000, // 30분
})
| 비교 항목 | staleTime (데이터 유효 기간) | cacheTime (캐시 유지 기간) |
|---|---|---|
| 기본값 | 0 (즉시 만료) | 5분 |
| 역할 | 데이터가 신선한지(Stale 상태) 판단 | 캐시된 데이터가 메모리에 얼마나 남아 있을지 결정 |
| 데이터 요청 | 신선할 때는 요청 X, | 만료되면 다시 요청 가능 (staleTime이 지나도 cacheTime 내에서는 캐시에서 사용 가능) |
| 네트워크 요청 | stale 상태가 되면 refetch 가능 | cacheTime이 지나면 데이터 삭제 후 다시 요청 필요 |
💡 결론
✔ staleTime은 데이터가 신선한지(Stale인지) 결정
✔ cacheTime은 캐시가 메모리에 얼마나 남아 있을지 결정
즉, staleTime은 데이터를 언제 새로 요청할지 결정하고, cacheTime은 캐시된 데이터를 언제 삭제할지 결정한다!
자주 변하지 않는 데이터
→ staleTime을 길게 설정하여 불필요한 네트워크 요청 방지
재방문 시에도 캐시된 데이터를 유지하고 싶다면
→ cacheTime을 길게 설정하여 성능 최적화