TanStack Query Library Document - dev-team-projects/DeliTalk GitHub Wiki

์ž‘์„ฑ์ž : ์ž„์„ฑ์ค€, ์ •ํ˜œ์˜, ์ด์œค์„œ


TanStack Query

  • ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ์ž๋™์œผ๋กœ ์บ์‹ฑ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ๋”ฉ/์—๋Ÿฌ ์ƒํƒœ๋ฅผ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌ ํ•ฉ๋‹ˆ๋‹ค.
    • โžก๏ธ ๋ฐ์ดํ„ฐ ํŒจ์นญ ๋กœ์ง์˜ ์ƒ์‚ฐ์„ฑ๊ณผ ์ผ๊ด€์„ฑ ํ–ฅ์ƒ
  • useEffect ๊ธฐ๋ฐ˜ ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ๋กœ ์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.


๋ฐ์ดํ„ฐ ํŒจ์นญ ์˜ˆ์ œ

GET /api/users

1. ๊ธฐ์กด ๋ฐฉ์‹: useEffect + useState

import { useEffect, useState } from 'react';
import axios from 'axios';

function UserList() {
  const [users, setUsers] = useState([]);
  const [isLoading, setIsLoading] = useState(true);
  const [isError, setIsError] = useState(false);

  useEffect(() => {
    setIsLoading(true);
    setIsError(false);

    axios
      .get('/api/users')
      .then((res) => {
        setUsers(res.data);
      })
      .catch((err) => {
        console.error(err);
        setIsError(true);
      })
      .finally(() => {
        setIsLoading(false);
      });
  }, []);

  if (isLoading) return <p>Loading...</p>;
  if (isError) return <p>Error fetching users</p>;

  return (
    <ul>
      {users.map((user) => (
        <li key={user.id}>{user.name}</li>
      ))}
    </ul>
  );
}

๋‹จ์ 

  • ์ƒํƒœ ๋ณ€์ˆ˜(isLoading, isError, users)๊ฐ€ ๋งŽ์•„์ง‘๋‹ˆ๋‹ค.
  • ์—๋Ÿฌ ์ฒ˜๋ฆฌ, ๋กœ๋”ฉ ์ฒ˜๋ฆฌ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์บ์‹ฑ ์—†์Œ โžก๏ธ ๋งค๋ฒˆ ์ƒˆ๋กœ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
  • ์žฌ์š”์ฒญ, refetch, stale control ๊ธฐ๋Šฅ ์—†์Šต๋‹ˆ๋‹ค.

2. TanStack Query ๋ฐฉ์‹

import { useQuery } from '@tanstack/react-query';
import axios from 'axios';

const fetchUsers = async () => {
  const { data } = await axios.get('/api/users');
  return data;
};

function UserList() {
  const {
    data: users,
    isLoading,
    isError,
  } = useQuery({
    queryKey: ['users'],
    queryFn: fetchUsers,
    staleTime: 1000 * 60 * 5, // 5๋ถ„๊ฐ„ ์บ์‹ฑ
  });

  if (isLoading) return <p>Loading...</p>;
  if (isError) return <p>Error fetching users</p>;

  return (
    <ul>
      {users.map((user) => (
        <li key={user.id}>{user.name}</li>
      ))}
    </ul>
  );
}

์žฅ์ 

  • ๋กœ๋”ฉ/์—๋Ÿฌ ์ƒํƒœ ์ž๋™ ์ œ๊ณต
    • ๋ฐ์ดํ„ฐ fetching ์ƒํƒœ(loading, error, success)๋ฅผ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•ด UI ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ„ํŽธํ•ฉ๋‹ˆ๋‹ค.
  • queryKey๋กœ ์บ์‹œ ๊ตฌ๋ถ„ ๋ฐ ์ž๋™ ๊ด€๋ฆฌ
    • ๋™์ผํ•œ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ณ , ํšจ์œจ์ ์œผ๋กœ ์บ์‹ฑ/๊ฐฑ์‹  ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐฐ๊ฒฝ refetch
    • ์‚ฌ์šฉ์ž๊ฐ€ ํ™”๋ฉด์— ๋จธ๋ฌด๋Š” ๋™์•ˆ์—๋„ ๋ฐ์ดํ„ฐ ์ตœ์‹  ์ƒํƒœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์บ์‹ฑ
    • ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ์บ์‹ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • retry
    • ์‹คํŒจ ์‹œ ์ž๋™ ์žฌ์‹œ๋„๋ฅผ ํ†ตํ•ด ๋„คํŠธ์›Œํฌ ๋ถˆ์•ˆ์ • ์ƒํ™ฉ์—๋„ ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ
    • ๋กœ๋”ฉ ์ƒํƒœ ๊ฐ’์œผ๋กœ ์Šคํ”ผ๋„ˆ ๋“ฑ UI ์š”์†Œ ์†์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • prefetch
    • ํŽ˜์ด์ง€ ์ด๋™ ์ „์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์™€ ๋น ๋ฅด๊ฒŒ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•˜๊ณ  ์žฌ์‚ฌ์šฉ์„ฑ ๋†’์Œ
    • ์„ ์–ธ์  API ๋•๋ถ„์— ์ฝ”๋“œ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ์„ ํ–ฅ์ƒ ์‹œํ‚ต๋‹ˆ๋‹ค.
โš ๏ธ **GitHub.com Fallback** โš ๏ธ