React Query는 비동기 데이터를 가져오고, 캐시하고, 동기화하며, 업데이트하고, 관리하는 작업을 수행, 이 라이브러리를 사용하면 컴포넌트가 서버 상태와 더 자연스럽게 상호 작용할 수 있으며, 캐싱, 동기화, 백그라운드 업데이트 등의 기능이 편리하게 제공(Component의 Lifecycle 구애 x)
서버의 상태를 불러오고, 캐싱하며, 지속적으로 동기화하고 업데이트 하는 작업을 도와주는 라이브러리
yarn add @tanstack/react-query
yarn add @tanstack/react-query-devtools
여러가지 장점이 있지만 주로 아래와 같이 프론트 개발자가 구현하기 귀찮은 일들을 수행합니다.
invalidateQueries)API 통신과 비동기 데이터 관리1를 위해 React Query를 적극적으로 활용(카카오페이)
🙌 「if(kakao)2021 - 카카오페이 프론트엔드 개발자들이 React Query를 선택한 이유」 세줄요약 🤟
<의견>
import axios from 'axios';
import {
QueryClient,
QueryClientProvider,
useMutation,
useQuery,
useQueryClient,
} from 'react-query';
// React Query는 내부적으로 queryClient를 사용하여
// 각종 상태를 저장하고, 부가 기능을 제공합니다.
const queryClient = new QueryClient();
function App() {
return (
<QueryClientProvider client={queryClient}>
<Menus />
</QueryClientProvider>
);
}
function Menus() {
const queryClient = useQueryClient();
// "/menu" API에 Get 요청을 보내 서버의 데이터를 가져옵니다.
const { data } = useQuery('getMenu', () =>
axios.get('/menu').then(({ data }) => data),
);
// "/menu" API에 Post 요청을 보내 서버에 데이터를 저장합니다.
const { mutate } = useMutation(
(suggest) => axios.post('/menu', { suggest }),
{
// Post 요청이 성공하면 위 useQuery의 데이터를 초기화합니다.
// 데이터가 초기화되면 useQuery는 서버의 데이터를 다시 불러옵니다.
onSuccess: () => queryClient.invalidateQueries('getMenu'),
},
);
return (
<div>
<h1> Tomorrow's Lunch Candidates! </h1>
<ul>
{data.map((item) => (
<li key={item.id}> {item.title} </li>
))}
</ul>
<button
onClick={() =>
mutate({
id: Date.now(),
title: 'Toowoomba Pasta',
})
}
>
Suggest Tomorrow's Menu
</button>
</div>
);
}
비동기적인 데이터를 처리하는 방식
jsxCopy code
import { useQuery } from 'react-query';
function Example() {
const { data, error, isLoading } = useQuery('repoData', fetchRepoData);
if (isLoading) {
return 'Loading...';
}
if (error) {
return 'An error has occurred: ' + error.message;
}
return (
<div>
{data.map(item => (
<div key={item.id}>{item.name}</div>
))}
</div>
);
}
jsxCopy code
import { useMutation } from 'react-query';
function UpdateUser() {
const mutation = useMutation(updateUser, {
onSuccess: () => {
queryClient.invalidateQueries('userData');
},
});
return (
<button onClick={() => mutation.mutate({ id: 1, name: 'New Name' })}>
Update User
</button>
);
}
jsxCopy code
const { data, refetch } = useQuery('repoData', fetchRepoData, {
refetchOnWindowFocus: false,
});
return (
<div>
<button onClick={() => refetch()}>Refetch Data</button>
{/* ... */}
</div>
);
jsxCopy code
const { data } = useQuery('repoData', fetchRepoData, {
staleTime: 1000 * 60 * 5, // 5 minutes
cacheTime: 1000 * 60 * 60, // 1 hour
});
jsxCopy code
import { ReactQueryDevtools } from 'react-query/devtools';
function App() {
return (
<QueryClientProvider client={queryClient}>
{/* ... */}
<ReactQueryDevtools initialIsOpen={false} />
</QueryClientProvider>
);
}
<참조>
https://tech.kakaopay.com/post/react-query-1/(리덕스의 사용 이유와 고민들이 잘나와있습니다.)
https://kyounghwan01.github.io/blog/React/react-query/basic/#react-query-장점(개인블로그)