리액트 쿼리!
리액트에서 비동기 로직을 리액트스럽게 다룰 수 있게 해주는 라이브러리이다.
server state를 아주 효율적으로 관리할 수 있다.
기존에 isLoading, isError, refetch, 데이터 캐싱 등 개발자가 직접 구현하려면 꽤 귀찮거나 까다로웠던 기능을 제공해준다.
이번 편에서는 간단하게 기본적인 사용 방법에 대해 작성하려한다.
QueryClientProvider
를 최상단에서 감싸주어야한다.client={queryClient}
작성해준다.import { QueryClient, QueryClientProvider } from "react-query";
const queryClient = new QueryClient();
export default function App() {
return (
<QueryClientProvider client={queryClient}>
<Home />
</QueryClientProvider>
);
}
import { useQuery } from "react-query";
// 주로 사용되는 3가지 return 값 외에도 더 많은 return 값들이 있다.
const { data, isLoading, error } = useQuery(queryKey, queryFn, options)
QueryKey
를 기반으로 데이터 캐싱을 관리한다.// 문자열
useQuery('todos', ...)
// 배열
useQuery(['todos'], ...)
const { data, isLoading, error } = useQuery(['todos', id], () => axios.get(`http://.../${id}`));
useQuery('todos', fetchTodos);
useQuery(['todos', todoId], () => fetchTodoById(todoId));
useQuery(['todos', todoId], async () => {
const data = await fetchTodoById(todoId);
return data
});
useQuery(['todos', todoId], ({ queryKey }) => fetchTodoById(queryKey[1]));
enabled
는 쿼리가 자동으로 실행되지 않게 설정하는 옵션이다.const { data } = useQuery(
['todos', id],
() => fetchTodoById(id),
{
enabled: !!id,
}
);
retry
는 실패한 쿼리를 재시도하는 옵션이다.staleTime
은 데이터가 fresh
상태로 유지되는 시간이다. 해당 시간이 지나면 stale
상태가 된다.cacheTime
은 inactive
상태인 캐시 데이터가 메모리에 남아있는 시간이다. 이 시간이 지나면 캐시 데이터는 가비지 컬렉터에 의해 메모리에서 제거된다.refetchOnMount
는 데이터가 stale 상태일 경우 마운트 시 마다 refetch를 실행하는 옵션이다.refetchOnWindowFocus
는 데이터가 stale 상태일 경우 윈도우 포커싱 될 때 마다 refetch를 실행하는 옵션이다.예제 코드!
// 유저 정보를 가져오는 쿼리이다.
const { data: userInfo } = useQuery(
['user'],
getUser,
{
refetchOnWindowFocus: true,
staleTime: 60 * 1000, // 1분
}
)
refetchOnReconnect
는 데이터가 stale 상태일 경우 재 연결 될 때 refetch를 실행하는 옵션이다.onSuccess
는 쿼리 성공 시 실행되는 함수이다.onError
는 쿼리 실패 시 실행되는 함수이다.예제 코드!
const { data: userInfo } = useQuery(
['user'],
getUser,
{
refetchOnWindowFocus: true,
staleTime: 60 * 1000, // 1분
onError: (error) => {
if (error.response?.data.code === 401) {
//...
}
},
}
)
onSettled
는 쿼리가 성공해서 성공한 데이터가 전달되거나, 실패해서 에러가 전달 될 때 실행되는 함수이다.initialData
를 설정하면 쿼리 캐시의 초기 데이터로 사용된다. (쿼리가 아직 생성되지 않았거나 캐시되지 않았을 때)