useMemo & useCallback

kirin.logΒ·2021λ…„ 9μ›” 7일
0
post-custom-banner

🧐 μ»΄ν¬λ„ŒνŠΈ λ Œλ”λ§ κ³Όμ •

μ»΄ν¬λ„ŒνŠΈκ°€ λ Œλ”λ§ λœλ‹€λŠ” 것은 κ·Έ ν•¨μˆ˜(μ»΄ν¬λ„ŒνŠΈ)λ₯Ό ν˜ΈμΆœν•˜μ—¬μ„œ μ‹€ν–‰(rendering)λ˜λŠ” 것을 λ§ν•œλ‹€. ν•¨μˆ˜κ°€ 싀행될 λ•Œλ§ˆλ‹€ 내뢀에 μ„ μ–Έλ˜μ–΄ 있던 ν‘œν˜„μ‹(λ³€μˆ˜, ν•¨μˆ˜ λ“±)도 맀번 λ‹€μ‹œ μ„ μ–Έλ˜μ–΄ μ‚¬μš©λœλ‹€.

μ»΄ν¬λ„ŒνŠΈλŠ” μžμ‹ μ˜ stateκ°€ λ³€κ²½λ˜κ±°λ‚˜, λΆ€λͺ¨μ—κ²Œμ„œ λ°›λŠ” propsκ°€ λ³€κ²½λ˜μ—ˆκ±°λ‚˜, λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈκ°€ λ Œλ”λ§ 될 λ•Œλ§ˆλ‹€ λ¦¬λ Œλ”λ§ λœλ‹€.
(심지어 ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈμ— μ΅œμ ν™” 섀정을 해주지 μ•ŠμœΌλ©΄ λΆ€λͺ¨μ—κ²Œμ„œ λ°›λŠ” propsκ°€ λ³€κ²½λ˜μ§€ μ•Šμ•˜λ”λΌλ„ λ¦¬λ Œλ”λ§ 됨. )

즉, λ¦¬λ Œλ”λ§μ΄ ν•„μš”μ—†λŠ” λ³€μˆ˜, ν•¨μˆ˜λ“€λ§ˆμ € 같이 μž¬λ Œλ”λ§λ˜λ―€λ‘œ λ‚­λΉ„, λΉ„νš¨μœ¨μ μ΄λ‹€.
(μ»΄ν¬λ„ŒνŠΈμ—μ„œ λ Œλ”λ§ 결과에 μ „ν˜€ 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠλŠ” 변경사항이 λ°œμƒν•˜κ²Œ λœλ‹€λ©΄, λΆˆν•„μš”ν•œ λ Œλ”λ§μ΄ λ°œμƒ ν•˜λ―€λ‘œ μ„±λŠ₯ 손싀이 λ°œμƒν•œλ‹€. μ΄λŠ” λ Œλ”λ§μ—μ„œ μˆ˜ν–‰ν•˜λŠ” 둜직이 λ§Žμ„ 수둝, λ§Žμ€ μ»΄ν¬λ„ŒνŠΈλ₯Ό 좜λ ₯ν•  수둝 손싀은 λ°°κ°€ λœλ‹€.)


🧐 λ©”λͺ¨μ΄μ œμ΄μ…˜(memoization)의 κ°œλ…

"λ©”λͺ¨μ΄μ œμ΄μ…˜(memoization)은 컴퓨터 ν”„λ‘œκ·Έλž¨μ΄ λ™μΌν•œ 계산을 λ°˜λ³΅ν•΄μ•Ό ν•  λ•Œ, 이전에 κ³„μ‚°ν•œ 값을 λ©”λͺ¨λ¦¬μ— μ €μž₯ν•¨μœΌλ‘œμ¨ λ™μΌν•œ κ³„μ‚°μ˜ 반볡 μˆ˜ν–‰μ„ μ œκ±°ν•˜μ—¬ ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 속도λ₯Ό λΉ λ₯΄κ²Œ ν•˜λŠ” κΈ°μˆ μ΄λ‹€. 동적 κ³„νšλ²•μ˜ 핡심이 λ˜λŠ” κΈ°μˆ μ΄λ‹€."

  • κΈ°λ³Έ κ°œλ…
    • useMemo와 useCallback은 λ©”λͺ¨μ΄μ œμ΄μ…˜ κΈ°λŠ₯을 μ§€μ›ν•˜λŠ” λ¦¬μ•‘νŠΈμ˜ λ‚΄μž₯ ν›…(hook)으둜, 퍼포먼슀 μ΅œμ ν™”λ₯Ό μœ„ν•˜μ—¬ μ‚¬μš©λœλ‹€.
    • useMemoλŠ” λ©”λͺ¨μ΄μ œμ΄μ…˜λœ 값을 λ°˜ν™˜ν•œλ‹€.(값을 κΈ°μ–΅ν•œλ‹€)
    • useCallback은 λ©”λͺ¨μ΄μ œμ΄μ…˜λœ 콜백(=ν•¨μˆ˜)을 λ°˜ν™˜ν•œλ‹€.(ν•¨μˆ˜λ₯Ό κΈ°μ–΅ν•œλ‹€)
    • useMemo와 useCallback은 2개의 인자λ₯Ό κ°–λŠ”λ‹€.
      • 첫번째 인자: κ³„μ‚°λœ 값을 returnν•˜λŠ” callback ν•¨μˆ˜
      • λ‘λ²ˆμ§Έ 인자: useMemo, useCallbackμ—κ²Œ μ–Έμ œ λ‹€μ‹œ 계산해야할지 μ•Œλ € 쀄 dependency 리슀트 λ°°μ—΄
        (🌲 두 번째 인수둜 μ „λ‹¬λœ μ˜μ‘΄μ„±μ΄ λ³€κ²½λ˜κΈ° μ „κΉŒμ§€ κΈ°μ–΅. λ‘λ²ˆμ§Έ μΈμžμ— 변경될 λ°μ΄ν„°μ˜ κ°’(state λ˜λŠ” ν•¨μˆ˜)이 λ“€μ–΄μ˜€κΈ° μ „κΉŒμ§€λŠ” updateκ°€ μ•ˆλœλ‹€.)
    • useCallback(fn, deps) / useMemo(() => fn, deps)와 κ°™λ‹€κ³  ν•œλ‹€.
      // use memo
      const memoizedValue = useMemo(() => value(a,b), [a,b]);  // λ©”λͺ¨μ΄μ œμ΄μ…˜ 된 κ°’
      const memoizedCallback = useCallback(() => fn(a,b), [a,b]);  // λ©”λͺ¨μ΄μ œμ΄μ…˜ 된 콜백

      ❗️ λ‘λ²ˆμ§Έ 인자(=deps)둜 λΉˆλ°°μ—΄([])을 λ„£μœΌλ©΄ μ–΄λ–€ μƒνƒœ 값에도 λ°˜μ‘ν•˜μ§€ μ•ŠμœΌλ©°, λͺ¨λ“  μƒνƒœ 변화에 λ°˜μ‘ν•œλ‹€(λͺ¨λ“  λ Œλ”λ§μ— λ³€ν™” 없이 μ €μž₯된 값을 λΆˆλŸ¬μ˜€λŠ” μ…ˆ.)

  • λ¦¬μ•‘νŠΈλŠ” λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ μœ„ν•œ μ„Έκ°œμ˜ apiλ₯Ό 제곡.

    • memo
    • useMemo
    • useCallback
  • λ¦¬μ•‘νŠΈ λ©”λͺ¨μ΄μ œμ΄μ…˜ νŠΉμ§• : λ°”λ‘œ μ΄μ „μ˜ κ°’λ§Œ λ©”λͺ¨μ΄μ œμ΄μ…˜ ν•œλ‹€

  • λ©”λͺ¨μ΄μ œμ΄μ…˜ 이유

    • λ³΅μž‘ν•œ(λ©”λͺ¨λ¦¬ μ†Œλͺ¨μ ) 연산을 λ°˜λ³΅ν•˜λŠ” 것을 ν”Όν•˜μ—¬ μ„±λŠ₯을 ν–₯μƒμ‹œν‚¨λ‹€.
    • μ•ˆμ •λœ κ°’ 제곡

β›± useMemo

  • useMemo()λŠ” 2개의 인자λ₯Ό λ°›λŠ”λ‹€.
    첫 λ²ˆμ§ΈλŠ” κ²°κ³Ό 값을 μƒμ„±ν•΄μ£ΌλŠ” νŒ©ν† λ¦¬ν•¨μˆ˜μ΄κ³ ,
    두 λ²ˆμ§ΈλŠ” 결과값을 μž¬ν™œμš©ν•  λ•Œ 기쀀이 λ˜λŠ” μž…λ ₯κ°’ 배열이닀.
  • 값을 λ°˜ν™˜(return)ν•œλ‹€
// 일반 React ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ
function Component() {
  const [count, setCount] = useState(0)
  const doubleCount = count * 2   // λ‘λ°°λ‘œ κ³„μ‚°ν•œ κ°’ 좜λ ₯

  return (
    <>
      <button onClick={() => setCount(count + 1)}> 카운트 </button>
    </>
  )
}



// useMemo μ‚¬μš©
import React, {useMemo} from 'react';

function Component() {
  const [count, setCount] = useState(0)
  const doubleCount = useMemo(() => count * 2, [count])
  // κ°’ μžμ²΄μ— useCallback μ‚¬μš©

  return (
    <>
      <button onClick={() => setCount(count + 1)}> 카운트 </button>
    </>
  )
}

β›± useCallback

  • useCallback()λŠ” 2개의 인자λ₯Ό λ°›λŠ”λ‹€.
    첫 λ²ˆμ§ΈλŠ” κ²°κ³Ό 값을 μƒμ„±ν•΄μ£ΌλŠ” νŒ©ν† λ¦¬ν•¨μˆ˜μ΄κ³ ,
    두 λ²ˆμ§ΈλŠ” 결과값을 μž¬ν™œμš©ν•  λ•Œ 기쀀이 λ˜λŠ” μž…λ ₯κ°’ 배열이닀.
// 일반 React ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ
function Component() {
  const [count, setCount] = useState(0)
  const handleClick = () => console.log('clicked!')

  return (
    <>
      <button onClick={() => setCount(count + 1)}> 카운트 </button>
      <button onClick={handleClick}>ν΄λ¦­ν•΄λ³΄μ„Έμš”!</button>
    </>
  )
}


// useCallback μ‚¬μš©
function Component() {
  const [count, setCount] = React.useState(0)
  const handleClick = useCallback(
    () => console.log('clicked!'),
  []) 
  // ν•¨μˆ˜ μžμ²΄μ— useCallback μ‚¬μš©

  return (
    <>
      <button onClick={() => setCount(count + 1)}> 카운트 </button>
      <button onClick={handleClick}>ν΄λ¦­ν•΄λ³΄μ„Έμš”!</button>
    </>
  )
}
profile
boma91@gmail.com
post-custom-banner

0개의 λŒ“κΈ€