5. usehooks-ts

1. usehooks-ts

usehooks-ts

๐Ÿ”— ์‹ค์Šต ๋งํฌ

๋ชจ๋“  Hook์— ๋Œ€ํ•œ ์ฝ”๋“œ๊ฐ€ ์›น ์‚ฌ์ดํŠธ์— ์ง์ ‘ ๋…ธ์ถœ๋จ

npm i usehooks-ts

์ฐธ/๊ฑฐ์ง“์„ ๋‹ค๋ฃฐ ๋• toggle ๊ฐ™์ด ์˜๋„๊ฐ€ ๋ช…ํ™•ํ•œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ

์˜ˆ์‹œ

// TimerControl.tsx

const {value: playing, toggle: togglePlaying} = useBoolean();

const handleClick = () => {
    togglePlaying();
};

return (
    <button type='button' onClick={handleClick}>Toggle</button>
)

// ๋˜๋Š” handleClick ๋Œ€์‹ ์— togglePlaying ์ง์ ‘ ์‚ฌ์šฉ 

return (
    <button type='button' onClick={togglePlaying}>Toggle</button>
)

์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๋นˆ ๋ฐฐ์—ด๋กœ ๋„ฃ์–ด์„œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰ํ•˜๋Š” Effect๋ฅผ ์žก์•„์ค„ ๋•Œ๊ฐ€ ๋งŽ์€๋ฐ, useEffectOnce๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋ช…ํ™•ํ•ด์ง ํ‘œํ˜„๋ ฅ์˜ ์ฆ๋Œ€

์˜ˆ์‹œ

// useFetchProducts.ts

useEffectOnce(() => {
    const fetchProducts = async () => {
        const url = 'http://localhost:3000/products';
        const response = await fetch(url);
        const data = await response.json();
        setProducts(data.products);
    };

    fetchProducts();
});

์ •๋ง ๊ฐ„๋‹จํžˆ ์“ธ ๋•Œ ์ข‹์Œ

์˜ˆ์‹œ

export default function useFetchProducts() {
    const url = 'http://localhost:3000/products';
    const {data} = useFetch(url);
    if (!data) {
        return [];
    }
    return data.products;
}
  • ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋”ฉ ์ค‘์ผ ๋•Œ๋Š” ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

๊ธฐํƒ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์ด ์‚ด์ง ๋” ์žˆ๋Š” useFetch ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์กฐ๊ธˆ ๋” ๋ณต์žกํ•ด๋„ ๊ดœ์ฐฎ๋‹ค๋ฉด, ์บ์‹œ ์ด์Šˆ๋ฅผ ๊ณ ๋ คํ•œ ์ข‹์€ ๋Œ€์•ˆ

React์—์„œ setInterval ๋“ฑ์„ ์“ธ ๋•Œ๋Š” ์ฃผ์˜ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์ด ์žˆ์–ด์„œ Custom Hook์„ ๋งŒ๋“ค์–ด์„œ ํ•ด๊ฒฐํ•ด์•ผ ํ•จ

// ๊ธฐ์กด ์ฝ”๋“œ
  useEffect(() => {
    setTimeout(() => {
      setReceipt(undef dined);
    }, 5000);
  }, [receipt]);

// useInterval ์ ์šฉ 
  useInterval(() => {
    setReceipt(undefined);
  }, receipt ? 5000 : null);

๋ชจ๋“  ์ข…๋ฅ˜์˜ ์ด๋ฒคํŠธ๋ฅผ ํ™•์ธ ๊ฐ€๋Šฅ ๐Ÿ’ก ํŠนํžˆ dispatchEvent๋กœ ์ „๋‹ฌ๋˜๋Š” ์ปค์Šคํ…€ ์ด๋ฒคํŠธ์— ๋ฐ˜์‘ํ•˜๊ธฐ ์ข‹์Œ

useClickAnyWhere()์—์„œ์˜ ์˜ˆ์‹œ

import { useEventListener } from 'usehooks-ts'

type Handler = (event: MouseEvent) => void

function useClickAnyWhere(handler: Handler) {
  useEventListener('click', event => {
    handler(event)
  })
}

export default useClickAnyWhere

localStorage์™€ JSON์œผ๋กœ ๊ฐ์ฒด ์˜์†ํ™” ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด(dispatchEvent + useEventListener) ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์™€ ๋™๊ธฐํ™”ํ•˜๋Š” ๊ฒŒ ๋งค์šฐ ์ค‘์š”ํ•œ ํŠน์ง•

OS์—์„œ ์„ค์ •๋œ ๋‹คํฌ๋ชจ๋“œ ์—ฌ๋ถ€(์ดˆ๊นƒ๊ฐ’)๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Œ

const isDarkOS = useMediaQuery(COLOR_SCHEME_QUERY)

2. SWR

SWR

SWR ๋ช…์นญ์€ HTTP RFC 5861(opens in a new tab)์— ์˜ํ•ด ์•Œ๋ ค์ง„ HTTP ์บ์‹œ ๋ฌดํšจ ์ „๋žต์ธ stale-while-revalidate์—์„œ ์œ ๋ž˜ SWR์€ ๋จผ์ € ์บ์‹œ(์Šคํƒœ์ผ)๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ ํ›„, fetch ์š”์ฒญ(์žฌ๊ฒ€์ฆ)์„ ํ•˜๊ณ , ์ตœ์ข…์ ์œผ๋กœ ์ตœ์‹ ํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ „๋žต

SWR์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๋Š” ์ง€์†์ ์ด๋ฉฐ ์ž๋™์œผ๋กœ ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ ์ŠคํŠธ๋ฆผ์„ ๋ฐ›๊ฒŒ ๋จ UI๋Š” ํ•ญ์ƒ ๋น ๋ฅด๊ณ  ๋ฐ˜์‘์ 

์žฅ์ 

๋‹จ ํ•œ ์ค„์˜ ์ฝ”๋“œ๋กœ ํ”„๋กœ์ ํŠธ ๋‚ด์˜ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ๋กœ์ง์„ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค์Œ์˜ ๊ธฐ๋Šฅ๋“ค์„ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

  • ๋น ๋ฅด๊ณ , ๊ฐ€๋ณ๊ณ , ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

  • ๋‚ด์žฅ๋œ ์บ์‹œ ๋ฐ ์š”์ฒญ ์ค‘๋ณต ์ œ๊ฑฐ

  • ์‹ค์‹œ๊ฐ„ ๊ฒฝํ—˜

  • ์ „์†ก ๋ฐ ํ”„๋กœํ† ์ฝœ์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š์Œ

  • SSR / ISR / SSG support

  • TypeScript ์ค€๋น„

  • React Native

3. React Query

TanStack Query

TS/JS, React, Solid, Vue ๋ฐ Svelte๋ฅผ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ๋น„๋™๊ธฐ ์ƒํƒœ ๊ด€๋ฆฌ

์„ธ๋ถ„ํ™”๋œ ์ƒํƒœ ๊ด€๋ฆฌ, ์ˆ˜๋™ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐ ๋์—†๋Š” ๋น„๋™๊ธฐ์‹ ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ ๊ทธ๋ฆ‡์„ ๋ฒ„๋ฆฌ์‹ญ์‹œ์˜ค. TanStack Query๋Š” ๊ฐœ๋ฐœ์ž์™€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๋ชจ๋‘๋ฅผ ์ง์ ‘์ ์œผ๋กœ ๊ฐœ์„ ํ•˜๋Š” ์„ ์–ธ์ ์ด๊ณ  ํ•ญ์ƒ ์ตœ์‹  ์ƒํƒœ์˜ ์ž๋™ ๊ด€๋ฆฌ ์ฟผ๋ฆฌ ๋ฐ ๋ณ€ํ˜•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์žฅ์ 

1. ์„ ์–ธ์  ๋ฐ ์ž๋™

React Query์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์œ„์น˜์™€ ํ•„์š”ํ•œ ์ตœ์‹  ์ •๋ณด๋ฅผ ์•Œ๋ ค์ฃผ๋ฉด ๋‚˜๋จธ์ง€๋Š” ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ zero-configuration์œผ๋กœ ์ฆ‰์‹œ ์บ์‹ฑ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์—…๋ฐ์ดํŠธ ๋ฐ stale ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌ

2. ๋‹จ์ˆœํ•˜๊ณ  ์นœ์ˆ™ํ•จ

promise, async/await ์ž‘์—… ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด React Query๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ์ „์—ญ ์ƒํƒœ, ๋ฆฌ๋“€์„œ, ์ •๊ทœํ™” ์‹œ์Šคํ…œ ๋˜๋Š” ์ดํ•ดํ•  ๋ฌด๊ฑฐ์šด ๊ตฌ์„ฑ์ด ์—†์Œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”(๋˜๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š”) ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋จ

3. ํ™•์žฅ ๊ฐ€๋Šฅ

React Query๋Š” ๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋งž๋Š” ๋…ธ๋ธŒ์™€ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ์˜ ๊ฐ ์˜ต์ €๋ฒ„ ์ธ์Šคํ„ด์Šค๊นŒ์ง€ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Œ ์ „์šฉ devtools, ๋ฌดํ•œ ๋กœ๋”ฉ API ๋ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๊ธ‰ mutation tool ์ œ๊ณต

Last updated