๐Ÿ‘ฉโ€๐Ÿ’ป
Megaptera Frontend
  • ์ฃผ์ฐจ๋ณ„ ํ•™์Šต
    • megaptera-front
    • 1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
      • 1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
      • 2. TypeScript
      • 3. React
      • 4. Testing Library
      • 5. Parcel & ESLint
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 2. JSX
      • 1. JSX
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 3. React๋กœ ์‚ฌ๊ณ ํ•˜๊ธฐ
      • 1. React Component
      • 2. React State
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 4. React Hooks
      • 1. Express
      • 2. Fetch API & CORS
      • 3. React์˜ Hook
      • 4. useRef & Custom Hook
      • 5. usehooks-ts
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 5. ํ…Œ์ŠคํŠธ
      • 1. TDD
      • 2. React Testing Library
      • 3. MSW
      • 4. Playwright
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 6. External Store
      • 1. External Store
      • 2. TSyringe
      • 3. Redux ๋”ฐ๋ผํ•˜๊ธฐ
      • 4. usestore-ts
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 7. React Router
      • 1. Routing
      • 2. Routes
      • 3. Router
      • 4. Navigation
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 8. CSS in JS
      • 1. Design System
      • 2. Style Basics
      • 3. CSS in JS
      • 4. styled-components
      • 5. props์™€ attrs
      • 6. Global Style & Theme
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 9. ์‡ผํ•‘๋ชฐ ๋ชฉ๋ก, ์ƒํ’ˆ ํŽ˜์ด์ง€
      • 1. ๊ฐœ๋ฐœํ•˜๊ธฐ ์ „ ์ค€๋น„
      • 2. ๋ชฉ๋ก ๋ณด๊ธฐ
      • 3. ์ƒํ’ˆ ์ƒ์„ธ ๋ณด๊ธฐ
      • 4. ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋ณด๊ธฐ
      • 5. ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ƒํ’ˆ ๋‹ด๊ธฐ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 10. ์‚ฌ์šฉ์ž ์ธ์ฆ, ์ธ๊ฐ€
      • 1. ๋กœ๊ทธ์ธ
      • 2. ๋กœ๊ทธ์•„์›ƒ
      • 3. ํšŒ์›๊ฐ€์ž…
      • 4. ์ฃผ๋ฌธ ๋ชฉ๋ก & ์ฃผ๋ฌธ ์ƒ์„ธ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 11. ์ฃผ๋ฌธ, ๊ฒฐ์ œ
      • 1. ๋ฐฐ์†ก ์ •๋ณด ์ž…๋ ฅ
      • 2. ํฌํŠธ์› ๊ฒฐ์ œ ์š”์ฒญ
      • 3. ๋ฐฐ์†ก ๋ฐ ๊ฒฐ์ œ ์ •๋ณด ์ „๋‹ฌ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 12. ์–ด๋“œ๋ฏผ
      • 1. ๊ด€๋ฆฌ์ž ์›น ์‚ฌ์ดํŠธ ๊ฐœ๋ฐœ ์‹œ์ž‘
      • 2. ๋กœ๊ทธ์ธ, ์‚ฌ์šฉ์ž ๋ชฉ๋ก
      • 3. ์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ฆฌ
      • 4. ์ฃผ๋ฌธ ๊ด€๋ฆฌ
      • 5. ์ƒํ’ˆ ๊ด€๋ฆฌ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
Powered by GitBook
On this page
  • 1. usehooks-ts
  • useBoolean
  • useEffectOnce
  • useFetch
  • useInterval
  • useEventListener
  • useLocalStorage
  • useDarkMode
  • 2. SWR
  • ์žฅ์ 
  • 3. React Query
  • ์žฅ์ 
  1. ์ฃผ์ฐจ๋ณ„ ํ•™์Šต
  2. 4. React Hooks

5. usehooks-ts

Previous4. useRef & Custom HookNextํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ

Last updated 2 years ago

1. 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 ๋ช…์นญ์€ 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

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 ์ œ๊ณต

(React Query)

usehooks-ts
๐Ÿ”— ์‹ค์Šต ๋งํฌ
useBoolean
useEffectOnce
useFetch
use-http
SWR
TanStack Query
useInterval
useEffect ๊ด€์ 
React์—์„œ์˜ ํƒ€์ด๋จธ part 1 : setInterval ๋ง๊ณ  ์ด๊ฒƒ! - ์ฝ”๋“œ์ข…๋‹˜ ์˜์ƒ
Ref ํ™œ์šฉ
useEventListener
useLocalStorage
useDarkMode
SWR
TanStack Query