
언제 어떤 걸 써야 하는지까지 알아보자! 🖐️ 🤓 🖐️
[ 가장 흔한 무효화 방식 ]
queryClient.invalidateQueries({ queryKey: ['mini'] });
💡 실제로 refetch를 트리거하려면 refetchOnMount, refetchOnWindowFocus 옵션이 활성화되어 있어야 한다.
[ 즉시 refetch ]
queryClient.refetchQueries({ queryKey: ['mini'] });
| invalidateQueries | refetchQueries |
|---|---|
| 상태만 stale로, 게으른 요청 | 바로 요청, 즉시 요청 |
💡 즉각적인 UI 업데이트가 필요한 경우 refetchQueries를 쓰는 게 더 직관적이다.
[ 컴포넌트 내부에서 수동 refetch ]
const { data, refetch, isFetching } = useQuery({
queryKey: ['mini'],
queryFn: fetchMini,
});
<button onClick={() => refetch()}>다시 불러오기</button>
💡 refetch()는 내부적으로 fetchQuery()를 호출한다.
[ 쿼리를 강제로 다시 fetch ]
await queryClient.fetchQuery({ queryKey: ['mini'], queryFn: fetchMini });
queryClient.fetchQuery({
queryKey: ['todos'],
queryFn: fetchTodos,
staleTime: 0,
gcTime: 0,
});
💡 fetchQuery()는 주로 쿼리를 미리 캐시에 채우거나, 특정 시점에 명확히 데이터를 받아야 할 때 사용한다.
[ 서버 요청 없이 데이터 갱신 ]
queryClient.setQueryData(['mini'], (old) => [...old, newMini]);
💡 이후 refetchQueries()로 새로고침을 트리거해줄 수도 있다.
| 목적 | 메서드 | 특징 |
|---|---|---|
| 자동 stale 처리 + 리렌더링 시 refetch | invalidateQueries() | 가장 많이 사용됨. 즉시 요청은 아님 |
| 즉시 다시 fetch | refetchQueries() | 강제 fetch, 지금 바로 요청 |
| 컴포넌트 안에서 수동 요청 | useQuery().refetch() | 버튼 클릭 등에서 사용 |
| 명확히 fetch 시점 제어 | fetchQuery() | 쿼리 prefetch, SSR, 미리 캐시 등 |
| 서버 없이 캐시만 수정 | setQueryData() | Optimistic update 등 |