React Query는 React의 누락된 데이터를 가져오는 라이브러리로 설명되지만, 보다 전문적인 용어로는 React 응용프로그램의 서버 상태를 불러오기, 캐싱, 동기화 및 업데이트하는 것을 쉽게 해줍니다.
출처 tanstack 공식문서
쉽게 말하면 React Query는 서버 데이터를 보다 쉽게 처리해주는 라이브러리 입니다.
따라서 React Query는 서버 데이터를 다루는 복잡한 작업을 대신 처리해주어, 개발자가 이에 대해 신경 쓰지 않아도 되기 떄문에 이로 인해 서버 데이터를 다루는 코드가 간결해지고, 애플리케이션의 성능과 사용자 경험을 향상 시킬 수 있습니다.
QueryClientProvider
는 최상위 폴더에서 사용하며 자식 컴포넌트들을 감싸줘야 합니다.
import { QueryClient, QueryClientProvider } from "react-query";
const queryClient = new QueryClient();
function App() {
return;
<QueryClientProvider client={queryClient}>...</QueryClientProvider>;
}
보통 GET으로 받아올 대부분의 API에 사용(데이터 Fetching 용)
예제)
import { useQuery } from "react-query";
function App() {
const info = useQuery("todos", fetchTodoList);
}
// 'todos', Query Key
// fetchTodoList, Query Function
Query Key
Key, Value 맵핑 구조?
String 형태
// a list of todos
useQuery('todos', ...) // queryKey === ['todos']
// Something else, whatever
useQuery('somethingSpecial', ...); // queryKey === ['somethingSpecial']
Array 형태
// an individual todo
useQuery(['todo', 5], ...);
// queryKey === ['todo', 5]
// an individual todo in a "preview" format
useQuery(['todo', 5, {preview: true}], ...)
// queryKey === ['todo', 5, {preview: true}]
// a list of todos that are "done"
useQuery(['todos', {type: 'done'}], ...)
// queryKey === ['todos', {type: 'done'}]
Query Function
Data Fetching 할 때 Promise 함수를 만드는데,
useQuery("fetchNumber", () => fetchNumber(number), options);
useQuery
const {
data,
dataUpdatedAt,
error,
errorUpdatedAt,
failureCount,
isError,
isFetched,
isFetchedAfterMount,
isFetching,
isIdle,
isLoading,
isLoadingError,
isPlaceholderData,
isPreviousData,
isRefetchError,
isRefetching,
isStale,
isSuccess,
refetch,
remove,
status
} = useQuery(queryKey, queryFn?, {...})
useQuery Option
} = useQuery(queryKey, queryFn?, {
cacheTime,
enabled,
initialData,
initialDataUpdatedAt,
isDataEqual,
keepPreviousData,
meta,
notifyOnChangeProps,
notifyOnChangePropsExclusions,
onError,
onSettled,
onSuccess,
placeholderData,
queryKeyHashFn,
refetchInterval,
refetchIntervalInBackground,
refetchOnMount,
refetchOnReconnect,
refetchOnWindowFocus,
retry,
retryOnMount,
retryDelay,
select,
staleTime,
structuralSharing,
suspense,
useErrorBoundary,
})
데이터 updating 시 사용
일반적으로 mutation은 queries와 달리 데이터를 생성/업데이트/삭제를 하거나 서버 부작용을 수행하는 데 사용됩니다. 이를 위해 React Query는 useMutation hook을 export 합니다.
tanstack 공식문서
즉, Mutations는 데이터 생성/수정/삭제용 입니다.
예제)
const mutation = useMutation((newTodo) => {
return axios.post("/todos", newTodo);
});
useMutation
const {
data,
error,
isError,
isIdle,
isLoading,
isPaused,
isSuccess,
mutate,
mutateAsync,
reset,
status,
} = useMutation(mutationFn, {...})
useMutation Option
} = useMutation(mutationFn, {
mutationKey,
onError,
onMutate,
onSettled,
onSuccess,
retry,
retryDelay,
useErrorBoundary,
meta,
})
낙관적 업데이트란?
서버로부터 성공적으로 업데이트가 되기 전 UI를 업데이트할 수 있도록 해주는 것이다.
즉, 서버로 요청을 보내기 전 UI 업데이트를 진행하는 것이 낙관적 업데이트 !
// Invalidate every query in the cache
queryClient.invalidateQueries();
// Invalidate every query with a key that starts with 'todos'
queryClient.invalidateQueries("todos");
참고: 우아한테크 youtube