{todos.map(todo => (
  • {todo.title}
  • ))} ); } export default TodoList; "> {todos.map(todo => (
  • {todo.title}
  • ))} ); } export default TodoList; "> {todos.map(todo => (
  • {todo.title}
  • ))} ); } export default TodoList; ">
    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

    Untitled

    <aside> ๐Ÿ”ฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ ์ค‘ ์„œ๋ฒ„์—์„œ ํŒจ์น˜๋œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ React Query๋ฅผ ํ™œ์šฉ

    React Query๋Š” ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ ๊ด€๋ฆฌ์— ์‚ฌ์šฉ๋˜๋Š” ๋„๊ตฌ๊ฐ€ ์•„๋‹ˆ๋‹ค.

    </aside>

    React ์•ฑ ์ƒํƒœ๋Š” ์ปจํ…์ŠคํŠธ ๋Œ€์‹ , Zustand ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.

    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;