React-Query
2023. 3. 12. 16:21ㆍ프로그래밍/React
- 목차
react-query / devtools 설치
npm install @tanstack/react-query @tanstack/react-query-devtools
QueryClientProvier / devtools 추가
import { QueryClient, QueryClientProvider } from 'react-query';
import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
// client 생성
const queryClient = new QueryClient();
export default function App() {
return (
// 앱에 client 제공
<QueryClientProvider client={queryClient}>
// devtools
<ReactQueryDevtools initialIsOpen={true} />
<Main />
</QueryClientProvider>
)
}
useQuery
import { useQuery } from 'react-query';
import { getTodos } from '../my-api';
function Todos() {
// useQuery 에 key, api 호출 함수를 전달
// 메모리에 해당 key 값으로 데이터가 보관됨 (데이터 캐시)
const { isLoading, error, data: todos } = useQuery(['todos'], getTodos);
// 로딩중일 경우 true
if (isLoading) return <p>Loading...</p>;
// 에러가 발생할 경우 true
if (error) return <p>Error!</p>;
return (
<div>
<ul>
{query.data.map(todo => (
<li key={todo.id}>{todo.title}</li>
))}
</ul>
</div>
)
}
- 첫 번째 인자로 쿼리 key 를 전달함
- 두 번째 인자로 데이터를 받아오는 함수를 전달함
- 쿼리 key 에 의해서 데이터가 캐시됨
- 서로 다른 컴포넌트에서 쿼리 key가 동일하고 데이터가 캐시되어 있다면 해당 데이터 공유 가능
useQuery(['todo', 5 ], ...);
useQuery(['todos', { type: 'done' }], ...);
useQuery(['todos', id], () => axios.get(`http://.../${id}`));
- 쿼리 key 는 조합해서 사용할 수 있음
- 쿼리가 변수에 의존하는 경우 쿼리 key 에도 추가해 주어야 함
useMutation
import { useQuery, useMutation, useQueryClient } from 'react-query';
import { getTodos, postTodo } from '../my-api';
function Todos() {
const queryClient = useQueryClient();
const { isLoading, error, data: todos } = useQuery(['todos'], getTodos);
const mutation = useMutation(postTodo, {
onSuccess: () => {
// 캐시 새로고침
queryClient.invalidateQueries(['todos']);
},
})
return (
<div>
<ul>
{query.data.map(todo => (
<li key={todo.id}>{todo.title}</li>
))}
</ul>
<button
onClick={() => {
mutation.mutate({
id: Date.now(),
title: '빨래하기',
})
}}
>
할일 추가
</button>
</div>
)
}
devTools

- ['todos', { type: 'done' }] 라는 key 조합을 가진 리액트 쿼리에 대한 정보
- 총 1개의 컴포넌트에서 보관하고 있음
- 캐시된 데이터는 fresh 한 상태임
useQuery / useInfiniteQuery 사용 시 기본적으로 캐시된 데이터는 stale 상태로 간주됨
이것을 변경하기 위해서는 쿼리 사용 시 staleTime 옵션을 사용할 수 있음
staleTime 옵션
- 네트워크 통신으로 받아온 데이터를 얼마동안 fresh 상태로 간주할 것인지 설정 가능
- fresh 상태일 경우 네트워크 통신을 다시 요청하지 않고 캐시된 데이터를 사용함
- 전역적 또는 쿼리 별로 설정 가능
stale 상태인 쿼리들은 아래 조건 하에 자동으로 네트워크 요청을 시도함 (refetch)
- 새로운 쿼리가 생성되었을 때
- 윈도우가 다시 포커스 되었을 때
- 네트워크가 다시 연결되었을 때
- 쿼리에 refetch interval 설정이 되었을 때 (몇 초 간격으로 refetch 할 것인지 설정)