๐Ÿ‘ฉโ€๐Ÿ’ป
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. useRef
  • ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
  • ์ฃผ์˜์ 
  • ref์™€ useRef
  • ์šฉ๋„
  • ํด๋กœ์ €(closure)
  • 2. Custom Hook
  • ํŠน์ง•
  • Custom Hook ์˜ˆ์ œ
  • ์žฅ์ 
  • 3. Hook์˜ ๊ทœ์น™
  1. ์ฃผ์ฐจ๋ณ„ ํ•™์Šต
  2. 4. React Hooks

4. useRef & Custom Hook

Previous3. React์˜ HookNext5. usehooks-ts

Last updated 2 years ago

1. useRef

์ปดํฌ๋„ŒํŠธ์˜ ์ƒ์• ์ฃผ๊ธฐ ์ „์ฒด์— ๊ฑธ์ณ์„œ ์œ ์ง€๋˜๋Š” ๊ฐ์ฒด(์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—†์–ด์งˆ ๋•Œ๊นŒ์ง€ ๋™์ผํ•œ ๊ฐ์ฒด๊ฐ€ ์œ ์ง€)

๊ฐ์ฒด ์ž์ฒด๊ฐ€ ๊ฐ’์€ ์•„๋‹ˆ๊ณ , ๊ฐ’์„ ์ฐธ์กฐ(reference)ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด ์–ธ์ œ๋“ ์ง€ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ

state์™€ ์ƒ๊ด€ ์—†์ด ์–ด๋–ค ๊ฐ’์„ ์œ ์ง€

๐Ÿ•ฐ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ์• ์ฃผ๊ธฐ

์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , ์—†์–ด์งˆ ๋•Œ(VDOM์œผ๋กœ ๋“ค์–ด๊ฐ„ ์š”์†Œ๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ) ๊นŒ์ง€

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

const refContainer = useRef(initialValue);

useRef๋Š” .current ํ”„๋กœํผํ‹ฐ๋กœ ์ „๋‹ฌ๋œ ์ธ์ž(initialValue)๋กœ ์ดˆ๊ธฐํ™”๋œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ref ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ ๋ฐ˜ํ™˜๋œ ๊ฐ์ฒด๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ „ ์ƒ์• ์ฃผ๊ธฐ๋ฅผ ํ†ตํ•ด ์œ ์ง€

๐Ÿ“ฆ ๋ณธ์งˆ์ ์œผ๋กœ useRef๋Š” .current ํ”„๋กœํผํ‹ฐ์— ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ฐ’์„ ๋‹ด๊ณ  ์žˆ๋Š” ์ƒ์ž

์ฃผ์˜์ 

useRef๋Š” ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๊ทธ๊ฒƒ์„ ์•Œ๋ ค์ฃผ์ง€๋Š” ์•Š์Œ ๐Ÿ’ก ์ƒํƒœ(state)๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์™€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜์ง€๋งŒ, ๋ ˆํผ๋Ÿฐ์Šค ๊ฐ์ฒด์˜ ํ˜„์žฌ ๊ฐ’(current)์ด ๋ฐ”๋€Œ๋”๋ผ๋„ ๋ Œ๋”๋ง์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ

  • .current ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณ€ํ˜•ํ•˜๋Š” ๊ฒƒ์ด ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐœ์ƒ์‹œํ‚ค์ง€๋Š” ์•Š์Œ

  • React๊ฐ€ DOM ๋…ธ๋“œ์— ref๋ฅผ attachํ•˜๊ฑฐ๋‚˜ detachํ•  ๋•Œ ์–ด๋–ค ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋Œ€์‹  ์ฝœ๋ฐฑ ref๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ

ref์™€ useRef

๐ŸŒณ ref

DOM์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ• <div ref={myRef} />๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ React๋กœ ref ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋ฉด, React๋Š” ๋…ธ๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ๋ณ€๊ฒฝ๋œ DOM ๋…ธ๋“œ์— ๊ทธ๊ฒƒ์˜ .current ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ค์ •

๐ŸŽ ref์™€ useRef

ref ์†์„ฑ๋ณด๋‹ค useRef()๊ฐ€ ๋” ์œ ์šฉ useRef Hook์€ DOM ref๋งŒ์„ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹˜ ์ด ๊ธฐ๋Šฅ์€ ํด๋ž˜์Šค์—์„œ ์ธ์Šคํ„ด์Šค ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์œ ์‚ฌํ•œ ์–ด๋–ค ๊ฐ€๋ณ€๊ฐ’์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ์— ํŽธ๋ฆฌ ref ๊ฐ์ฒด๋Š” ํ˜„์žฌ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ณ  ์–ด๋–ค ๊ฐ’์ด๋“  ๋ณด์œ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜ ์ปจํ…Œ์ด๋„ˆ ์ด๋Š” class์˜ ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ์™€ ์œ ์‚ฌ

โ‡’ useRef()๊ฐ€ ์ˆœ์ˆ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ useRef()์™€ {current: ...} ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์˜ ์œ ์ผํ•œ ์ฐจ์ด์ ์€, useRef๋Š” ๋งค๋ฒˆ ๋ Œ๋”๋ง์„ ํ•  ๋•Œ ๋™์ผํ•œ ref ๊ฐ์ฒด๋ฅผ ์ œ๊ณต

์šฉ๋„

  1. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ๊นŒ์ง€ ๋™์ผํ•œ ๊ฐ’์„ ์จ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ โ‡’ input ๋“ฑ์˜ ID ๊ด€๋ฆฌ

  2. (ํŠนํžˆ useEffect ๋“ฑ๊ณผ ํ•จ๊ป˜ ์“ฐ๋ฉด์„œ ๋งŒ๋‚˜๊ฒŒ ๋˜๋Š”) ๋น„๋™๊ธฐ ์ƒํ™ฉ์—์„œ ํ˜„์žฌ ๊ฐ’์„ ์ œ๋Œ€๋กœ ์“ฐ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ

    • โ—๏ธ Closure โ†’ ๋ณ€์ˆ˜๋ฅผ capture, bind๋ฅผ ๊นœ๋นกํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ข…์ข… ๋ฐœ์ƒ

์˜ˆ์‹œ

์ ˆ๋Œ€๋กœ ์“ธ ์ผ์ด ์—†๋Š” ์–ต์ง€๋กœ ๊พธ๋ฉฐ๋‚ธ ์ƒํ™ฉ

// 5์ดˆ ํ›„์— ํ˜„์žฌ์˜ ์ž…๋ ฅ๊ฐ’์„ ๋ณด๋ ค๊ณ  ํ•  ๋•Œ 

useEffect(() => {
    setTimeout(() => {
        console.log(filterText);
    }, 5_000);
}, []);
  • ํ˜„์žฌ๊ฐ’์ด ๋‚˜์˜ค์ง€ ์•Š์Œ โ†’ ์‹œ์ž‘ํ•  ๋•Œ์˜ ๊ฐ’์ด ๋“ค์–ด๊ฐ”๊ธฐ ๋•Œ๋ฌธ

  const query = useRef('');

  useEffect(() => {
    query.current = filterText;
  }, [filterText]);

  useEffect(() => {
    setTimeout(() => {
      console.log(query.current);
    }, 5_000);
  }, []);
  • ํ˜„์žฌ๊ฐ’์ด ์ œ๋Œ€๋กœ ์ถœ๋ ฅ๋จ

ํด๋กœ์ €(closure)

์–ด๋–ค ํ•จ์ˆ˜์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ทธ ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€ํ•จ์ˆ˜์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ํ˜„์ƒ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ LexicalEnvironment๊ฐ€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํŒ… ๋˜์ง€ ์•Š๋Š” ํ˜„์ƒ

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

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ•จ์ˆ˜๋Š” ์ˆจ๊น€ ํ”„๋กœํผํ‹ฐ์ธ [[Environment]]๋ฅผ ์ด์šฉํ•ด ์ž์‹ ์ด ์–ด๋””์„œ ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€๋ฅผ ๊ธฐ์–ต ํ•จ์ˆ˜ ๋ณธ๋ฌธ์—์„  [[Environment]]๋ฅผ ์‚ฌ์šฉํ•ด ์™ธ๋ถ€ ๋ณ€์ˆ˜์— ์ ‘๊ทผ

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜

ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์ข…๋ฃŒ๋˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜์˜ LexicalEnvironment๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐ โ†’ ํ•จ์ˆ˜์™€ ๊ด€๋ จ๋œ ๋ณ€์ˆ˜๋“ค์€ ์ด๋•Œ ๋ชจ๋‘ ์‚ฌ๋ผ์ง(๊ด€๋ จ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ) ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ชจ๋“  ๊ฐ์ฒด๋Š” ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์ผ ๋•Œ๋งŒ ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€๋จ ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ 0์ด ๋˜๋ฉด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์˜ ์ˆ˜์ง‘ ๋Œ€์ƒ์ด ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์‚ฌ๋ผ์ง

ํ˜ธ์ถœ์ด ๋๋‚œ ํ›„์—๋„ ์—ฌ์ „ํžˆ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ์ค‘์ฒฉ ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ์Œ ์ด๋•Œ๋Š” ์ด ์ค‘์ฒฉํ•จ์ˆ˜์˜ [[Environment]] ํ”„๋กœํผํ‹ฐ์— ์™ธ๋ถ€ ํ•จ์ˆ˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์ €์žฅ(๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ) ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ๋๋‚ฌ์ง€๋งŒ LexicalEnvironment๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€๋˜๋Š” ์ด์œ 

์˜ˆ์™ธ

2. Custom Hook

๋กœ์ง์„ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ œ์ผ ์‰ฌ์šด ๋ฐฉ๋ฒ• Extract Function์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋จ(์ปดํฌ๋„ŒํŠธ ๋กœ์ง์„ ํ•จ์ˆ˜๋กœ ๋ฝ‘์•„๋‚ด์–ด ์žฌ์‚ฌ์šฉ) ๊ธฐ๋ณธ์ ์œผ๋กœ Hook์˜ ๋””์ž์ธ์„ ๋”ฐ๋ฅด๋Š”, ๊ธฐ์กด๊ณผ ๊ฐ™์€ ์ฝ”๋“œ

ํŠน์ง•

1. ์ด๋ฆ„์ด use๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜

  • ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„ : ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” PascalCase

  • Hook์˜ ์ด๋ฆ„ : use๋กœ ์‹œ์ž‘ํ•˜๋Š” camelCase

React ์ปดํฌ๋„ŒํŠธ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ Custom Hook์€ ํŠน์ •ํ•œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Œ ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฌด์—‡์„ ์ธ์ˆ˜๋กœ ๋ฐ›์•„์•ผ ํ•˜๋ฉฐ, ๋ฌด์—‡์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋Š” ์ง€๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Œ

2. Custom Hook์€ ๋‹ค๋ฅธ Hook์„ ํ˜ธ์ถœ ๊ฐ€๋Šฅ

Hook์€ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— Hook ์‚ฌ์ด์—์„œ๋„ ์ •๋ณด๋ฅผ ์ „๋‹ฌ ๊ฐ€๋Šฅ

3. Custom Hook์€ ๋…๋ฆฝ๋œ state๋ฅผ ์–ป์Œ

Custom Hook์€ ์ƒํƒœ ๊ด€๋ จ ๋กœ์ง(๊ตฌ๋…์„ ์„ค์ •ํ•˜๊ณ  ํ˜„์žฌ ๋ณ€์ˆซ๊ฐ’์„ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ)์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๊ฐ๊ฐ์˜ Custom Hook์— ๋Œ€ํ•œ ํ˜ธ์ถœ์€ ์„œ๋กœ ๋…๋ฆฝ๋œ state๋ฅผ ๋ฐ›์Œ ๊ทธ ์•ˆ์˜ state์™€ effect๋Š” ์™„์ „ํžˆ ๋…๋ฆฝ์  ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ useState์™€ useEffect๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๊ณ  ์ด๋“ค์€ ๋ชจ๋‘ ์™„์ „ํžˆ ๋…๋ฆฝ์ 

Custom Hook ์˜ˆ์ œ

// useFetchProducts.ts

export default function useFetchProducts() {
    const [products, setProducts] = useState<Product[]> ([]);

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

        fetchProducts();
    }, []);

    return products;
}
// App.tsx

export default function App() {
    const products = useFetchProducts();
    
   return (
       <FilterableProductTable products={products} />
   );
}

์žฅ์ 

  • ์ปดํฌ๋„ŒํŠธ ์ฝ”๋“œ๊ฐ€ ๋ช…ํ™•ํ•ด์ง

  • ์žฌ์‚ฌ์šฉ ํŽธ๋ฆฌ

  • ์ผ์ข…์˜ ์บก์Аํ™” โ‡’ setProducts๊ฐ€ ์‹ค์ˆ˜๋กœ ์ž˜๋ชป ์“ฐ์ผ ๋ฌธ์ œ๋ฅผ ํ•ด์†Œ

  • Hook์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ฆฌ์— ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋”ํ•˜์ง€ ์•Š์Œ

  • state๋ฅผ ์ดํ•ดํ•˜๊ณ  ๊ณ ๋ฏผํ•˜์ง€ ์•Š์•„๋„ ์“ธ ์ˆ˜ ์žˆ์Œ(๊ทธ๋ƒฅ ๊บผ๋‚ด๋‹ค ์“ฐ๋ฉด ๋จ)

3. Hook์˜ ๊ทœ์น™

Hook ํ˜ธ์ถœ์€ ๊ทœ์น™์ด ์žˆ์–ด์„œ ๋‹จ์ˆœํ•˜๊ฒŒ ์“ฐ๋„๋ก ๋…ธ๋ ฅํ•ด์•ผ ํ•จ

  1. Function Component ๋ฐ”๋กœ ์•ˆ์ชฝ(ํ•จ์ˆ˜์˜ ์ตœ์ƒ์œ„)์—์„œ๋งŒ ํ˜ธ์ถœ

  2. Function Component ๋˜๋Š” Custom Hook์—์„œ๋งŒ ํ˜ธ์ถœ

โš ๏ธ ์ฒ˜์Œ์—๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋‚˜ ์กฐ๊ฑด๋ฌธ ์•ˆ์—์„œ Hook์„ ํ˜ธ์ถœํ•˜๋Š” ์‹ค์ˆ˜๋ฅผ ์ €์ง€๋ฅด๊ธฐ ์‰ฌ์šฐ๋‹ˆ ์ฃผ์˜ ๊ฐ€๋Šฅํ•˜๋ฉด ๋ฐ”๊นฅ์œผ๋กœ ๋นผ๊ธฐ

// TimerControl.tsx

if (playing) {
    const products = useFetchProducts();
    console.log(products);
}
  • ์˜ค๋ฅ˜ ๋ฐœ์ƒ

// custom hook์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ณณ

const { products, fetchProducts } = useFetchProducts();
  • ์• ์ดˆ์— custom hook์„ ๋งŒ๋“ค ๋•Œ ์‹ ๊ฒฝ์จ์•ผ ํ•จ

์„ ์ด์šฉํ•ด ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๋ฉด ํ•จ์ˆ˜์˜ [[Environment]] ํ”„๋กœํผํ‹ฐ๊ฐ€ ํ˜„์žฌ LexicalEnvironment๊ฐ€ ์•„๋‹Œ ์ „์—ญ LexicalEnvironment๋ฅผ ์ฐธ์กฐ โ‡’ new Function์„ ์ด์šฉํ•ด ๋งŒ๋“  ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ณ , ์˜ค์ง ์ „์—ญ ๋ณ€์ˆ˜์—๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ

๊ณต์‹ ๋ฌธ์„œ์˜ useRef
beta ๋ฌธ์„œ์˜ useRef
Ref์™€ DOM
๐Ÿ”— ์‹ค์Šต ๋งํฌ
๋ณ€์ˆ˜์˜ ์œ ํšจ๋ฒ”์œ„์™€ ํด๋กœ์ €
new Function
Custom Hook
๐Ÿ”— ์‹ค์Šต ๋งํฌ
Hook์˜ ๊ทœ์น™