๐ŸณReact | React Query ์‹œ์ž‘ํ•˜๊ธฐ

์›์˜ยท2023๋…„ 8์›” 16์ผ
4

์ƒˆ๋กœ์šด ์ง€์‹๐Ÿ’ก

๋ชฉ๋ก ๋ณด๊ธฐ
12/15
post-thumbnail

๐Ÿ”ŽReact Query

  • ๊ณต์‹๋ฌธ์„œ
  • ํŽธํ•œ ๋น„๋™๊ธฐ ๊ณผ์ •์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋„คํŠธ์›Œํฌ ํ†ต์‹  ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ฐ€๋Šฅ
  • Hook์—์„œ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ํ•  ๋•Œ์˜ ๋ฌธ์ œ์  ๋ณด์™„ ๊ฐ€๋Šฅ

๐Ÿ’กHook ํŠน์ง•๊ณผ ๋ฌธ์ œ์ 

  • Hook์€ ์•ˆ์— ์žˆ๋Š” ์ƒํƒœ๋ฅผ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ์žฌ์‚ฌ์šฉ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹˜
  • Hook์„ ํ˜ธ์ถœํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋งˆ๋‹ค ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋‚ด๋ถ€ ์ƒํƒœ๋“ค์„ ๊ฐ€์ง€๋ฉฐ, ์‚ฌ์šฉํ•  ๋•Œ ๋งˆ๋‹ค ๊ฐ๊ฐ ๋กœ์ง ์ˆ˜ํ–‰(๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ํ•˜๋Š” Hook์ธ ๊ฒฝ์šฐ ๊ฐ๊ฐ ๋„คํŠธ์›Œํฌ ํ†ต์‹  ๋ฐœ์ƒ)

๋ฌธ์ œ์  1. ์บ์‹œ(cache)๊ฐ€ ์•ˆ๋จ

  • ๋„คํŠธ์›Œํฌ์—์„œ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ„๋„๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กญ๊ฒŒ ๋ฐ›์•„์˜ด

๋ฌธ์ œ์  2. ์žฌ์‹œ๋„(retry) ๊ธฐ๋Šฅ ์—†์Œ

  • ๋„คํŠธ์›Œํฌ ํ†ต์‹  ์‹คํŒจํ–ˆ์„ ๋•Œ ์žฌ์‹œ๋„ํ•˜๋Š” ๊ธฐ๋Šฅ ์—†์Œ

์˜ˆ์‹œ

  • API ์š”์ฒญ์„ ๋ฐ›์•„์™€์„œ ์ƒํƒœ๋ฅผ ๋ฆฌํ„ดํ•ด์ฃผ๋Š” Custom Hook์„ ์‚ฌ์šฉ(์ฐธ๊ณ : Custom Hook ํฌ์ŠคํŒ…)
  • ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ ๋‘๊ฐœ์—์„œ ๊ฐ™์€ API ํ˜ธ์ถœ
  • ์ฒ˜์Œ ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋”ฉ๋  ๋•Œ ๊ฐ™์€ ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค์ง€๋งŒ fetch๊ฐ€ ๋‘๋ฒˆ ๋ฐœ์ƒํ•˜๊ณ , ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค fetch ๋ฐœ์ƒํ•จ

๐Ÿ’กuseQuery

  • useQuery API ํ™œ์šฉ๋ฒ•
  • ์ค‘๋ณต๋˜๋Š” ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์ค„์ผ ์ˆ˜ ์žˆ์Œ
  • ๊ฐ™์€ key๋ฅผ ๊ฐ€์ง€๋Š” ์š”์ฒญ์ผ ๊ฒฝ์šฐ, ํ•œ๋ฒˆ fetch ํ›„ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ ๋ฉ”๋ชจ๋ฆฌ์— ๋ณด๊ด€(์บ์‹ฑ)
const query = useQuery({ queryKey: ['todos'], queryFn: fetchTodos });
  • ์ฒซ๋ฒˆ์งธ ์ธ์ž : key
    • ๋„คํŠธ์›Œํฌ ํ†ต์‹ ๋ณ„๋กœ ๊ฐ๊ฐ ๊ณ ์œ ํ•œ key๋ฅผ ๊ฐ€์ง
    • ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ key ์ด๋ฆ„์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ๋ณด๊ด€
  • ๋‘๋ฒˆ์งธ ์ธ์ž : ๋„คํŠธ์›Œํฌ ํ†ต์‹  ํ•จ์ˆ˜
    • ๋„คํŠธ์›Œํฌ ํ†ต์‹  ํ†ตํ•ด ๋ฐ์ดํ„ฐ ๋ฐ›์•„์˜ค๋Š” ํ•จ์ˆ˜, ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ Promise ํ˜•ํƒœ๋กœ ๊ฐ’ ๋ฆฌํ„ด
  • ์„ธ๋ฒˆ์งธ ์ธ์ž : options

์˜ˆ์‹œ

  • ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ useQuery ํ™œ์šฉํ•ด API ์š”์ฒญ
  const {
    data,
    isLoading,
    error,
  } = useQuery(['exampleKey'], async () => {
    console.log('fetching in useQuery...');
    return fetch('exampleAPI').then((res) => res.json());
  });

  • ์ฒ˜์Œ ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋”ฉ๋  ๋•Œ Custom Hook์„ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ์™€ ๋‹ฌ๋ฆฌ fetch ํ•œ๋ฒˆ ๋ฐœ์ƒ
  • ์ฒซ๋ฒˆ์งธ ์š”์ฒญ์—์„œ fetch ํ›„ ๋ฐ์ดํ„ฐ ์บ์‹ฑ
  • ๊ฐ™์€ key ๊ฐ’ exampleKey๋ฅผ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋‘๋ฒˆ์งธ ์š”์ฒญ์—์„œ fetch ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ด

๐Ÿ’กkey

  • key ๊ธฐ์ค€์œผ๋กœ ์บ์‹ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ์œ ํ•œ key๊ฐ’์„ ์ž˜ ์ •ํ•˜๋Š”๊ฒŒ ์ค‘์š”
  • ๋ฐฐ์—ด๋กœ ์„ค์ •ํ•ด ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ key๋“ค์˜ ์กฐํ•ฉ์„ ๋งŒ๋“ฆ
// key๊ฐ’์œผ๋กœ 'example' ๊ฐ€์ง€๋ฉด ๊ฐ™์€ ์บ์‹œ ์‚ฌ์šฉ
useQuery({ queryKey: ['example'], ... })

// 'example' + ์„ธ๋ถ€ ์ƒํƒœ๋กœ ๋‹ค์–‘ํ•œ key ์กฐํ•ฉํ•ด์„œ ๋‹ค๋ฅธ ์บ์‹œ ์‚ฌ์šฉ
// ์•„๋ž˜ ์„ธ๊ฐ€์ง€ ์˜ˆ์‹œ ๋ชจ๋‘ ์„œ๋กœ ๋‹ค๋ฅธ ์บ์‹œ ์‚ฌ์šฉ
useQuery({ queryKey: ['example'], ... })

// An individual example
useQuery({ queryKey: ['example', 5], ... })

// An individual todo in a "preview" format
useQuery({ queryKey: ['example', 5, { preview: true }], ...})

์˜ˆ์‹œ

  • ์œ„ ์˜ˆ์‹œ์—์„œ ์ฒดํฌ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค๋ฅธ API ๋ฐ›์•„์˜ค๊ธฐ
const [checked, setChecked] = useState(false);
const { data, isLoading, error }
  // checked ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ํ•˜๋ฏ€๋กœ key์— ์ถ”๊ฐ€
  = useQuery(['exampleKey', checked], async () => { 
    console.log('fetching in useQuery...');
    return fetch(`${checked?'sale_':''}/exampleAPI`).then((res) => res.json());
  });
  const handleChange = () => setChecked((prev) => !prev);

  • checked ์—ฌ๋ถ€์— ๋”ฐ๋ผ key๊ฐ€ ๋‹ฌ๋ผ์ง€๊ณ  ๋‹ค๋ฅธ API๊ฐ€ ์š”์ฒญ๋จ

๊ทผ๋ฐ ๋ญ”๊ฐ€ ์ด์ƒํ•œ๊ฒŒ ์žˆ๋‹ค...๐Ÿฅฒ

  • checked ์—ฌ๋ถ€์— ๋”ฐ๋ผ key ๊ฐ’์ด ['exampleKey', false] , ['exampleKey', true]๋กœ ์บ์‹ฑ๋  ๊ฒƒ
  • ๊ทธ๋Ÿฌ๋ฉด ๋กœ๋”ฉ๋  ๋•Œ, ์ฒ˜์Œ ์ฒดํฌํ•  ๋•Œ๋งŒ fetch๊ฐ€ ๋ฐœ์ƒํ•ด์•ผ ํ• ํ…๋ฐ..
  • ์™œ ์ƒํƒœ ๋ฐ”๋€”๋•Œ๋งˆ๋‹ค fetch ๋ฐœ์ƒ...?

์ด๋Š” useQuery ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋ฉด ์ฆ‰์‹œ ์˜ค๋ž˜๋œ(stale) ๋ฐ์ดํ„ฐ ์ƒํƒœ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ
useQuery์˜ ์„ธ๋ฒˆ์งธ ์ธ์ž์ธ options๋กœ ์ œ์–ด ๊ฐ€๋Šฅ ๊ด€๋ จ ํฌ์ŠคํŒ… ๋ณด๋Ÿฌ๊ฐ€๊ธฐ๐Ÿค—

profile
ํ™”์ดํŒ…~~^ใ…^/

0๊ฐœ์˜ ๋Œ“๊ธ€