1. 빠른 시작
React Query는 3가지 핵심 개념을 가진다.
Queries(데이터 질문과 관련된 것, (데이터 있는지 질문(=조회)))Mutations(데이터 변화와 관련된 것, (생성, 수정, 삭제))Query Invalidation(query가 유효한지 검증)
1import { useQuery, useMutation, useQueryClient, QueryClient, QueryClientProvider } from '@tanstack/react-query'2import { getTodos, postTodo } from '../my-api'34// Create a client5const queryClient = new QueryClient()67function App() {8return (9// Provide the client to your App10<QueryClientProvider client={queryClient}>11<Todos />12</QueryClientProvider>13)14}1516function Todos() {17// Access the client18const queryClient = useQueryClient()1920// Queries21const query = useQuery({ queryKey: ['todos'], queryFn: getTodos })2223// Mutations24const mutation = useMutation({25mutationFn: postTodo,26onSuccess: () => {27// Invalidate and refetch28queryClient.invalidateQueries({ queryKey: ['todos'] })29},30})3132return (33<div>34<ul>{query.data?.map(todo => <li key={todo.id}>{todo.title}</li>)}</ul>3536<button37onClick={() => {38mutation.mutate({39id: Date.now(),40title: 'Do Laundry',41})42}}43>44Add Todo45</button>46</div>47)48}4950render(<App />, document.getElementById('root'))
2. 개발도구(Devtools)
React Query는 전용 devtools와 함께 제공한다.
2024.12.12 기준
현재 devtools는 React Native를 지원하지 않습니다. 또한 DevTools를 사용하여 Queries를 관찰할 수 있지만, Mutations은 관찰 불가능 https://tanstack.com/query/latest/docs/react/devtools#install-and-import-the-devtools
2.1 설치
devtools는 설치해야 하는 별도의 패키지이다.
1$ npm i @tanstack/react-query-devtools2# or3$ pnpm add @tanstack/react-query-devtools4# or5$ yarn add @tanstack/react-query-devtools
Next 13+ App Dir의 경우, 작동하려면 dev 종속성으로 설치해야 한다.
다음과 같이 devtools를 가져올 수 있다.
1import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
2.2 플로팅(Floating) Mode
- 플로팅 모드는 화면 모서리에 토글을 제공해서, devtools를 표시하거나 숨기는 기능
- 이 토글 상태는 다시 로드할 떄, localStorage에 저장되고 기억됨
- React 앱에서 가능한 최상단에 배치할 수록 잘 작동함 (e.g. 페이지 root 파일)
1import { ReactQueryDevtools } from '@tanstack/react-query-devtools'23function App() {4return (5<QueryClientProvider client={queryClient}>6{/* The rest of your application */}7<ReactQueryDevtools initialIsOpen={false} />8</QueryClientProvider>9)10}
2.3 Devtools 옵션
ReactQueryDevtools의 옵션은 공식문서 참고
2.4 production(실제 운영환경) 구간에서 Devtools
Devtools는 프로덕션 빌드 단계에서 제외된다. 그러나 프로덕션 단계에서 devtools를 지연 로드하는 것이 바람직할 수 있음.
1import * as React from 'react'2import { QueryClient, QueryClientProvider } from '@tanstack/react-query'3import { ReactQueryDevtools } from '@tanstack/react-query-devtools'4import { Example } from './Example'56const queryClient = new QueryClient()78const ReactQueryDevtoolsProduction = React.lazy(() =>9import('@tanstack/react-query-devtools/build/modern/production.js').then(d => ({10default: d.ReactQueryDevtools,11})),12)1314function App() {15const [showDevtools, setShowDevtools] = React.useState(false)1617React.useEffect(() => {18// @ts-ignore19window.toggleDevtools = () => setShowDevtools(old => !old)20}, [])2122return (23<QueryClientProvider client={queryClient}>24<Example />25<ReactQueryDevtools initialIsOpen />26{showDevtools && (27<React.Suspense fallback={null}>28<ReactQueryDevtoolsProduction />29</React.Suspense>30)}31</QueryClientProvider>32)33}3435export default App
이를 통해 window.toggleDevtools()를 호출하면, devtools 번들을 다운로드하여 표시함
2.5 최신 번들러
번들러가 패키지 내보내기를 지원하는 경우 다음 가져오기 경로를 사용할 수 있습니다.
1const ReactQueryDevtoolsProduction = React.lazy(() =>2import('@tanstack/react-query-devtools/production').then(d => ({3default: d.ReactQueryDevtools,4})),5)
TypeScript의 경우 TypeScript v4.7 이상이 필요한 tsconfig에서 moduleResolution: 'nodenext' 설정해야 한다.
3. 타 라이브러리와 비교
- react-query팀에서 편향되지 않도록 노력해서 타 라이브러리와 비교했다고 함
- https://tanstack.com/query/latest/docs/react/comparison
- 하단에
github에서 이 페이지 편집 버튼을 눌러 정보가 편향되지 않도록 수정 가능함
아이콘 별 의미
-
✅ : 지원됨
-
🟡 : 지원O, 비공식
-
🔶 : 지원O, 문서화O, but 구현 시 추가 사용자 코드 필요
-
🛑 : 지원O, 문서화X
-
React Query
-
SWR
-
Apollo Client
-
RTK-Query
-
React Router
각자 react-query 공식문서 보고, 뭐가 좋은지 자기 상항에 맞게 판단하면 된다.