{todos.map(todo => (
import axios from 'axios';
import { useState, useEffect } from 'react';
interface Todo {
id: number;
title: string;
userId: number;
completed: boolean;
}
function TodoList() {
const [todos, setTodos] = useState<Todo[]>([]);
const [error, setError] = useState<Error | null>(null);
useEffect(() => {
axios.get('<https://jsonplaceholder.typicode.com/todos>')
.then(response => setTodos(response.data))
.catch(error => setError(error));
}, []);
if (error) {
return <p>{error.message}</p>
}
return (
<ul className="list-group">
{todos.map(todo => (
<li key={todo.id} className="list-group-item">
{todo.title}
</li>
))}
</ul>
);
}
export default TodoList;
<aside> ๐ฅ React App์ ์ผ๋ฐ์ ์ธ ์ํ ๋ฐ ์ดํํธ ๊ด๋ฆฌ ์ฝ๋์ด๋ค.
์์ฑ๋ ์ฝ๋์์๋ ์๋ ๋ฌธ์ ๋ฅผ ์ฐพ์ ์ ์๋ค.
React Query๋ React ์ฑ์์ ๋ฐ์ดํธ ํจ์น, ์บ์ฑ ๊ด๋ฆฌ์ ์ฌ์ฉ๋๋ ๊ฐ๋ ฅํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
</aside>
TanStack Query | React Query, Solid Query, Svelte Query, Vue Query

<aside> ๐ฅ ์ ํ๋ฆฌ์ผ์ด์ ์ํ ์ค ์๋ฒ์์ ํจ์น๋ ์ํ๋ฅผ ๊ด๋ฆฌํ ๋ React Query๋ฅผ ํ์ฉ
React Query๋ ํด๋ผ์ด์ธํธ ์ํ ๊ด๋ฆฌ์ ์ฌ์ฉ๋๋ ๋๊ตฌ๊ฐ ์๋๋ค.
</aside>

React ์ฑ ์ํ๋ ์ปจํ ์คํธ ๋์ , Zustand ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉ ํ ์ ์๋ค.
pnpm add @tanstack/[email protected] // ์ค์น
pnpm add -D @tanstack/eslint-plugin-query // ํ๋ฌ๊ทธ์ธ ์ค์น
<aside> ๐ฅ React Query๋ ์ ์ฉ ๊ฐ๋ฐ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋ค. ์ด ๋๊ตฌ๋ ๋ชจ๋ ๋ด๋ถ ์์ ์ ์๊ฐํํ๋ ๋ฐ ๋์์ด ๋๋ฉฐ ๋๋ฒ๊น ์ ํจ๊ณผ์ ์ผ๋ก ํ ์ ์๊ฒ ๋ง๋ ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก React Query Devtools๋ ๊ฐ๋ฐ ์ค์๋ง ์ฌ์ฉ๋๋ฉฐ, ํ๋ก๋์ ๋น๋ ์ค์๋ ์๋ ์ ์ธ
</aside>
pnpm add @tanstack/[email protected] // ๊ฐ๋ฐ๋๊ตฌ ์ค์น
// React Query ํด๋ผ์ด์ธํธ ํ๊ฒฝ ๊ตฌ์ฑ
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
const queryClient = new QueryClient(); // ๊ผญ ์ค์นํ๊ณ , ๋ชจ๋ ์ฟผ๋ฆฌ์ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ ์ต์
// ์ฟผ๋ฆฌ ํด๋ผ์ด์ธํ๋ฅด ์ฑ์ ๊ณต๊ธ
function App() {
return (
<>
<HelmetProvider>
<ThemeProvider>
<AuthProvider>
// ์ฟผ๋ฆฌ ํด๋ผ์ด์ธํธ๋ฅผ ์ฑ์ ๊ณต๊ธ
<QueryClientProvider client={queryClient}>
<div className="App">
<RouterProvider router={router} />
</div>
// ํ ์คํ ์ฟผ๋ฆฌ ๊ฐ๋ฐ ๋๊ตฌ , ๊ฐ๋ฐ ์ค์๋ง ๋ณด์ธ๋ค.
<ReactQueryDevtools />
</QueryClientProvider>
</AuthProvider>
</ThemeProvider>
</HelmetProvider>
<Toaster />
</>
);
}
export default App;