25.06.13 - se5ri/React GitHub Wiki

ch 04 λ¦¬μ•‘νŠΈ ν›…

ch04 - 05 useMemo

useMemo

  • μ§€μ •ν•œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ λ°˜ν™˜λ°›μ€ 결과값을 내뢀에 μ €μž₯(캐싱)ν•˜λŠ” ν•¨μˆ˜

API

const calculateValue = function(){ ... };
const cachedValue = useMemo(calculateValue, dependencies);

λ§€κ°œλ³€μˆ˜

  • calculateValue: 캐싱할 값을 κ³„μ‚°ν•˜μ—¬ λ°˜ν™˜ν•˜λŠ” 순수 ν•¨μˆ˜
  • dependencies: 의쑴 객체 λ°°μ—΄
    • 계산 결과에 영ν–₯을 μ£ΌλŠ” calculateValue ν•¨μˆ˜μ˜ μΈμžκ°’
    • 이 λ°°μ—΄μ˜ 값이 ν•˜λ‚˜λΌλ„ λ³€κ²½λ˜λ©΄ calculateValue ν•¨μˆ˜λ₯Ό λ‹€μ‹œ ν˜ΈμΆœν•˜κ³ , λ³€κ²½λ˜μ§€ μ•ŠμœΌλ©΄ μΊμ‹œλœ 값을 λ°˜ν™˜
    • 빈 배열을 μ§€μ •ν•˜λ©΄ μ˜μ‘΄μ„±μ΄ μ—†μœΌλ―€λ‘œ 맀번 μΊμ‹œλœ 값을 λ°˜ν™˜

리턴값

  • calculateValue ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œ κ²°κ³Όκ°’
  • λ‹€μŒ λ Œλ”λ§ μ€‘μ—λŠ” dependenciesκ°€ λ³€κ²½λ˜μ§€ μ•ŠμœΌλ©΄ μΊμ‹œλœ κ²°κ³Όλ₯Ό, λ³€κ²½λ˜μ—ˆμœΌλ©΄ calculateValue ν•¨μˆ˜λ₯Ό λ‹€μ‹œ ν˜ΈμΆœν•œ κ²°κ³Όκ°’

React.memo

  • μ»΄ν¬λ„ŒνŠΈλ₯Ό memoizeν•œ ν›„ λ¦¬λ Œλ”λ§ 될 λ•Œ propsκ°€ λ³€κ²½λ˜μ§€ μ•ŠμœΌλ©΄ memoize된 μ»΄ν¬λ„ŒνŠΈλ₯Ό λ°˜ν™˜
  • μ»΄ν¬λ„ŒνŠΈκ°€ λ¦¬λ Œλ”λ§λ  λ•Œ propsκ°€ λ³€κ²½λ˜μ§€ μ•ŠμœΌλ©΄ μ΅œμ’…μ μœΌλ‘œ λΈŒλΌμš°μ € DOM에 μ“°κΈ° μž‘μ—…μ΄ 이루어지지 μ•Šμ§€λ§Œ, 가상 DOM 생성과 비ꡐ μž‘μ—…μ—λ„ λ¦¬μ†ŒμŠ€κ°€ μ‚¬μš©λ˜λ―€λ‘œ, memoize된 μ»΄ν¬λ„ŒνŠΈλŠ” μ„±λŠ₯ ν–₯상에 도움을 쀄 수 있음
  • λ¦¬λ Œλ”λ§ λ λ•Œ λˆˆμ—λ„κ²Œ 지연이 λ°œμƒν•˜λŠ” 경우 μ‚¬μš©

API

const MemoizedComponent = React.memo(SomeComponent, arePropsEqual?)

λ§€κ°œλ³€μˆ˜

  • SomeComponent: memoizeν•  λŒ€μƒ μ»΄ν¬λ„ŒνŠΈ
  • arePropsEqual(선택): memoize된 μ»΄ν¬λ„ŒνŠΈλ₯Ό λ°˜ν™˜ν• μ§€, μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‹€μ‹œ ν˜ΈμΆœν• μ§€λ₯Ό κ²°μ •ν•˜λŠ” ν•¨μˆ˜
    • μ»΄ν¬λ„ŒνŠΈμ˜ 이전 props 및 μƒˆλ‘œμš΄ propsλ₯Ό 인자둜 λ°›λŠ” ν•¨μˆ˜
    • trueλ₯Ό λ°˜ν™˜ν•˜λ©΄ memoize된 μ»΄ν¬λ„ŒνŠΈλ₯Ό μ‚¬μš©ν•˜κ³ , falseλ₯Ό λ°˜ν™˜ν•˜λ©΄ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‹€μ‹œ ν˜ΈμΆœν•œ 결과값을 μ‚¬μš©
    • μƒλž΅ μ‹œ 이전 props와 μƒˆλ‘œμš΄ propsλ₯Ό μ–•κ²Œ λΉ„κ΅ν•˜μ—¬ κ°™μœΌλ©΄ true, λ‹€λ₯΄λ©΄ falseλ₯Ό λ°˜ν™˜ν•˜λŠ” κΈ°λ³Έ λ™μž‘

리턴값

  • memoize된 SomeComponent

React.memo μ‚¬μš© μ‹œμ 

  • μ»΄ν¬λ„ŒνŠΈ 호좜 μ‹œ μ‹œκ°„μ΄ 였래 κ±Έλ¦¬λŠ” μ—°μ‚° μž‘μ—…μ΄ μžˆλŠ” 경우
    • memoize된 μ»΄ν¬λ„ŒνŠΈλ₯Ό μž¬μ‚¬μš©ν•˜λ©΄ μ»΄ν¬λ„ŒνŠΈ 호좜 횟수λ₯Ό 쀄일 수 있음
  • λ¦¬λ Œλ”λ§λ  λ•Œ propsκ°€ 자주 λ³€κ²½λ˜μ§€ μ•ŠλŠ” μ»΄ν¬λ„ŒνŠΈ
    • propsκ°€ 자주 λ³€κ²½λ˜λŠ” μ»΄ν¬λ„ŒνŠΈμ—λŠ” propsλ₯Ό λΉ„κ΅ν•˜λŠ” 둜직이 λΆˆν•„μš”ν•˜κ²Œ λ™μž‘ν•˜λ―€λ‘œ, 였히렀 μ„±λŠ₯에 μ’‹μ§€ μ•ŠμŒ

κ³ μ°¨ ν•¨μˆ˜ (Higher-Order Function)

μ •μ˜

  • ν•¨μˆ˜λ₯Ό 인자둜 μ „λ‹¬λ°›κ±°λ‚˜ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜.

μ˜ˆμ‹œ

  • Array.prototype.forEach, Array.prototype.map, Array.prototype.findIndex, Array.prototype.filter λ“±.
  • λ¦¬μ•‘νŠΈμ—μ„œμ˜ ν™œμš©
    • μ»΄ν¬λ„ŒνŠΈ(ν•¨μˆ˜)λ₯Ό 인자둜 λ°›μ•„ 곡톡 λ‘œμ§μ„ μΆ”κ°€ν•œ μƒˆλ‘œμš΄ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ°˜ν™˜.
    • μ€‘λ³΅λ˜λŠ” λ‘œμ§μ„ κ³ μ°¨ ν•¨μˆ˜μ— μ •μ˜ν•˜μ—¬ μ»΄ν¬λ„ŒνŠΈλ³„λ‘œ μž¬μ‚¬μš© κ°€λŠ₯.
    • React.memoκ°€ λŒ€ν‘œμ μΈ κ³ μ°¨ ν•¨μˆ˜. πŸ“œ 05 useMemo - ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ„ memoize
  • πŸ’» App.tsx

ch04 - 06 useCallback

useCallback

  • μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ—μ„œ μ •μ˜ν•œ ν•¨μˆ˜λ₯Ό μΊμ‹œ
  • μ»΄ν¬λ„ŒνŠΈκ°€ λ‹€μ‹œ λ Œλ”λ§λ˜λ”λΌλ„ ν•¨μˆ˜κ°€ λ‹€μ‹œ μƒμ„±λ˜μ§€ μ•Šκ³  μΊμ‹œλœ ν•¨μˆ˜λ₯Ό μ‚¬μš©
  • λΆ€λͺ¨κ°€ μ •μ˜ν•œ 이벀트 λ¦¬μŠ€λ„ˆλ₯Ό μžμ‹μ—κ²Œ props둜 전달할 λ•Œ, λΆ€λͺ¨κ°€ λ¦¬λ Œλ”λ§λ˜λŠ” 경우 μžμ‹λ„ λ¦¬λ Œλ”λ§λ˜μ§€λ§Œ, μ΄λ•Œ propsκ°€ λ°”λ€Œμ§€ μ•ŠμœΌλ©΄ μžμ‹μ€ κΈ°μ‘΄ DOM을 μž¬μ‚¬μš©ν•˜λ„λ‘ λ©”λͺ¨μ΄μ œμ΄μ…˜ν•  수 있음
    • 이벀트 λ¦¬μŠ€λ„ˆλ₯Ό μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ—μ„œ μ •μ˜ν•˜λ©΄ λΆ€λͺ¨κ°€ λ¦¬λ Œλ”λ§λ  λ•Œ λ¦¬μŠ€λ„ˆ ν•¨μˆ˜λ„ μƒˆλ‘œ μƒμ„±λ˜λ―€λ‘œ μžμ‹μ— μ „λ‹¬ν•˜λŠ” propsκ°€ λ°”λ€Œμ–΄ λ©”λͺ¨μ΄μ œμ΄μ…˜μ΄ λ˜μ§€ μ•Šκ³  μžμ‹λ„ λ¦¬λ Œλ”λ§μ΄ λ°œμƒ
    • useCallback()을 μ‚¬μš©ν•˜λ©΄ λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈκ°€ μž¬ν˜ΈμΆœλ˜μ–΄λ„ λ¦¬μŠ€λ„ˆκ°€ μˆ˜μ •λ˜μ§€ μ•Šκ³  μœ μ§€λ˜λ―€λ‘œ μžμ‹λ„ κΈ°μ‘΄ DOM을 μž¬μ‚¬μš©ν•˜μ—¬ μ„±λŠ₯이 ν–₯상됨

API

const cachedFn = useCallback(fn, dependencies);

λ§€κ°œλ³€μˆ˜

  • fn: 캐싱할 ν•¨μˆ˜
  • dependencies: 의쑴 객체 λ°°μ—΄
    • μΊμ‹±λœ ν•¨μˆ˜μ—μ„œ μ»΄ν¬λ„ŒνŠΈμ˜ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  경우 ν•¨μˆ˜ 생성 λ‹Ήμ‹œμ˜ 값을 μ°Έμ‘°ν•˜κ³  있기 λ•Œλ¬Έμ— 이 값이 λ°”λ€Œλ©΄ ν•¨μˆ˜λ„ λ‹€μ‹œ 생성해야 함. 이 값을 μ˜μ‘΄μ„±μœΌλ‘œ μ§€μ •ν•˜λ©΄ μ˜μ‘΄μ„±μ΄ λ°”λ€” λ•Œλ§ˆλ‹€ μƒˆλ‘œμš΄ ν•¨μˆ˜λ₯Ό μƒμ„±ν•˜μ—¬ λ°˜ν™˜
    • 빈 배열을 μ§€μ •ν•˜λ©΄ μ˜μ‘΄μ„±μ΄ μ—†μœΌλ―€λ‘œ 맀번 μΊμ‹œλœ ν•¨μˆ˜λ₯Ό λ°˜ν™˜

리턴값

  • μ΅œμ΄ˆμ—λŠ” fn ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜κ³ , λ‹€μŒ λ Œλ”λ§λΆ€ν„°λŠ” dependenciesκ°€ λ³€ν•˜μ§€ μ•Šμ•˜λ‹€λ©΄ 이전에 λ°˜ν™˜ν•œ μΊμ‹œλœ ν•¨μˆ˜λ₯Ό, dependenciesκ°€ λ³€ν–ˆλ‹€λ©΄ μƒˆλ‘œ μƒμ„±λœ fn ν•¨μˆ˜λ₯Ό λ°˜ν™˜

useMemo vs. React.memo vs. useCallback

  • useMemoλŠ” ν•¨μˆ˜λ₯Ό 인자둜 μ „λ‹¬ν•˜κ³ , μ „λ‹¬λœ ν•¨μˆ˜μ˜ μ‹€ν–‰ κ²°κ³Ό(리턴값)λ₯Ό memoize 함
  • React.memoλŠ” μ»΄ν¬λ„ŒνŠΈλ₯Ό 인자둜 μ „λ‹¬ν•˜κ³ , μ „λ‹¬λœ μ»΄ν¬λ„ŒνŠΈλ₯Ό memoize 함
  • useCallback은 ν•¨μˆ˜λ₯Ό 인자둜 μ „λ‹¬ν•˜κ³ , μ „λ‹¬λœ ν•¨μˆ˜λ₯Ό memoize 함
  • 차이점: ν•¨μˆ˜μ˜ 리턴 κ°’ vs. μ»΄ν¬λ„ŒνŠΈ vs. ν•¨μˆ˜ 자체

πŸ“œ 06 useCallback(ν•¨μˆ˜ 자체λ₯Ό memoize), React.memo(μ»΄ν¬λ„ŒνŠΈλ₯Ό memoize)

ch04 - 07 customHook - useCounter μ»€μŠ€ν…€ ν›…

Custom Hook

  • κ°œλ°œμžκ°€ 직접 μž‘μ„±ν•˜λŠ” λ¦¬μ•‘νŠΈ ν›…μœΌλ‘œ, λ¦¬μ•‘νŠΈμ˜ λ‚΄μž₯ ν›…(useState, useEffect λ“±)을 μ΄μš©ν•΄ νŠΉμ • λ‘œμ§μ„ μž¬μ‚¬μš© κ°€λŠ₯ν•˜κ²Œ λ§Œλ“  ν•¨μˆ˜
  • μ—¬λŸ¬ μ»΄ν¬λ„ŒνŠΈμ—μ„œ κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλŠ” μƒνƒœ κ΄€λ¦¬λ‚˜ μ‚¬μ΄λ“œ μ΄νŽ™νŠΈ λ‘œμ§μ„ ν•˜λ‚˜μ˜ ν›…μœΌλ‘œ 묢을 수 있음
  • λ¦¬μ•‘νŠΈμ˜ λ‚΄μž₯ 훅은 일반 ν•¨μˆ˜μ—μ„œλŠ” μ‚¬μš©ν•  수 μ—†μœΌλ―€λ‘œ, λ‚΄μž₯ 훅을 ν™œμš©ν•˜λ €λ©΄ μ»€μŠ€ν…€ 훅을 μž‘μ„±ν•΄μ•Ό 함
  • μ»€μŠ€ν…€ ν›…μ˜ 이름은 λ¦¬μ•‘νŠΈ ν›…μž„μ„ λͺ…μ‹œμ μœΌλ‘œ λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ useXXX ν˜•νƒœλ‘œ μž‘μ„±ν•˜λŠ” 것이 ꢌμž₯됨
    • 예: useFetch, useLocalStorage λ“±

ν›… μ‚¬μš© μ‹œ μ£Όμ˜μ‚¬ν•­

  • 클래슀 기반 μ»΄ν¬λ„ŒνŠΈμ—μ„œλŠ” 훅을 μ‚¬μš©ν•  수 μ—†μŒ
    • 훅은 ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ μ „μš©μ΄λ©°, μƒνƒœ 관리 및 생λͺ… μ£ΌκΈ° κ΄€λ ¨ κΈ°λŠ₯을 ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ λ‚΄μ—μ„œλ§Œ μ‚¬μš©ν•  수 있음
  • 훅은 ν•¨μˆ˜ μ»΄ν¬λ„ŒνŠΈμ˜ μ΅œμƒμœ„μ—μ„œλ§Œ ν˜ΈμΆœν•΄μ•Ό 함
    • 훅을 반볡문, 쑰건문, 쀑첩 ν•¨μˆ˜ λ‚΄μ—μ„œ ν˜ΈμΆœν•˜λ©΄ μ»΄ν¬λ„ŒνŠΈκ°€ λ Œλ”λ§λ  λ•Œλ§ˆλ‹€ 호좜 μˆœμ„œκ°€ λ‹¬λΌμ Έμ„œ 문제λ₯Ό μΌμœΌν‚¬ 수 있음
    • ν›…μ˜ 호좜 μˆœμ„œκ°€ λ°”λ€Œλ©΄ λ¦¬μ•‘νŠΈλŠ” ν›…μ˜ μƒνƒœλ₯Ό 좔적할 수 μ—†μ–΄μ„œ μ—λŸ¬κ°€ λ°œμƒν•  수 있음
  • 훅은 항상 λ™μΌν•œ μˆœμ„œλ‘œ ν˜ΈμΆœλ˜μ–΄μ•Ό 함
    • 각 λ Œλ”λ§λ§ˆλ‹€ λ™μΌν•œ μˆœμ„œλ‘œ 훅이 ν˜ΈμΆœλ˜μ–΄μ•Ό ν•˜λ―€λ‘œ, μ‘°κ±΄λ¬Έμ΄λ‚˜ 반볡문 λ‚΄μ—μ„œ 훅을 ν˜ΈμΆœν•˜λŠ” νŒ¨ν„΄μ„ ν”Όν•΄μ•Ό 함

πŸ“œ 07 customHook - useCounter μ»€μŠ€ν…€ ν›… μ‚¬μš©