[React] useCallback πŸ†š useMemo πŸ†š React.memo

ttiningΒ·2025λ…„ 2μ›” 20일

useCallback πŸ†š useMemo πŸ†š React.memo


πŸ“Š React μ΅œμ ν™” 도ꡬ 비ꡐ μš”μ•½

ν•­λͺ©useCallbackuseMemoReact.memo
λͺ©μ ν•¨μˆ˜ μž¬μƒμ„± λ°©μ§€κ°’ μž¬κ³„μ‚° λ°©μ§€μ»΄ν¬λ„ŒνŠΈ λ¦¬λ Œλ”λ§ λ°©μ§€
리턴 νƒ€μž…ν•¨μˆ˜κ°’(데이터)μ»΄ν¬λ„ŒνŠΈ (κ³ μ°¨ μ»΄ν¬λ„ŒνŠΈ λ°˜ν™˜)
μ£Ό μš©λ„μ½œλ°± ν•¨μˆ˜λ₯Ό μžμ‹μ— 전달할 λ•Œκ³„μ‚° λΉ„μš©μ΄ 큰 μ—°μ‚° κ²°κ³Όλ₯Ό 캐싱할 λ•Œpropsκ°€ κ°™μœΌλ©΄ λ¦¬λ Œλ”λ§ 막기
λ™μž‘ λ°©μ‹μ˜μ‘΄μ„± 배열이 λ°”λ€” λ•Œλ§Œ ν•¨μˆ˜ μƒˆλ‘œ μƒμ„±μ˜μ‘΄μ„± 배열이 λ°”λ€” λ•Œλ§Œ κ°’ λ‹€μ‹œ 계산props의 얕은 비ꡐ κ²°κ³Όκ°€ λ™μΌν•˜λ©΄ μž¬μ‚¬μš©
μ‚¬μš© λŒ€μƒν•¨μˆ˜κ°’ (숫자, λ°°μ—΄, 객체 λ“±)ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ
μ–Έμ œ μ‚¬μš©ν•˜λ©΄ μ’‹μ€κ°€μžμ‹μ—κ²Œ ν•¨μˆ˜λ₯Ό props둜 λ„˜κΈΈ λ•ŒλΉ„μš©μ΄ 큰 계산이 자주 λ°œμƒν•  λ•Œμžμ‹ μ»΄ν¬λ„ŒνŠΈκ°€ λΆˆν•„μš”ν•˜κ²Œ λ¦¬λ Œλ”λ§ 될 λ•Œ
주의 μ‚¬ν•­κ³Όλ„ν•œ μ‚¬μš©μ€ 였히렀 μ„±λŠ₯ μ €ν•˜λ©”λͺ¨λ¦¬ μ‚¬μš© 증가 및 λ³΅μž‘λ„ 증가 κ°€λŠ₯props둜 객체/배열을 λ„˜κΈΈ 땐 useMemo 병행 ν•„μš”


πŸ“Œ 상세 μ„€λͺ…

πŸ“ useCallback

πŸ’‘ μ–΄λ–€ 경우 μœ μš©ν•œκ°€?

μ»΄ν¬λ„ŒνŠΈ λ‚΄μ—μ„œ λ§Œλ“  ν•¨μˆ˜λ₯Ό μžμ‹ μ»΄ν¬λ„ŒνŠΈμ— props둜 λ„˜κΈΈ λ•Œ,
ν•¨μˆ˜κ°€ λ¦¬λ Œλ”λ§λ§ˆλ‹€ μƒˆλ‘œ μƒμ„±λ˜λ©΄ μžμ‹λ„ λ¦¬λ Œλ”λ§λ¨ β†’ 이λ₯Ό 막기 μœ„ν•΄ μ‚¬μš©

⚠️ μ£Όμ˜ν•  점

λΆˆν•„μš”ν•˜κ²Œ λͺ¨λ“  ν•¨μˆ˜λ₯Ό 감싸면 μ˜μ‘΄μ„± 좔적 및 λ Œλ”λ§ μ΅œμ ν™” λΉ„μš©μ΄ 였히렀 늘 수 있음


πŸ“ useMemo

πŸ’‘ μ–΄λ–€ 경우 μœ μš©ν•œκ°€?

μ—°μ‚° λΉ„μš©μ΄ 큰 계산이 λ°˜λ³΅λ˜λŠ” 경우 (filter, map, reduce, λ³΅μž‘ν•œ 계산 λ“±)

⚠️ μ£Όμ˜ν•  점

κ°„λ‹¨ν•œ 값에 λŒ€ν•΄ λ‚¨μš©ν•˜λ©΄ λ©”λͺ¨λ¦¬ λ‚­λΉ„, μ½”λ“œ λ³΅μž‘μ„±λ§Œ 증가함


πŸ“ React.memo

πŸ’‘ μ–΄λ–€ 경우 μœ μš©ν•œκ°€?

μžμ‹ μ»΄ν¬λ„ŒνŠΈκ°€ propsκ°€ λ³€ν•˜μ§€ μ•Šμ•„λ„ λ¦¬λ Œλ”λ§ λ˜λŠ” 경우 λ°©μ§€

⚠️ μ£Όμ˜ν•  점

κ°μ²΄λ‚˜ 배열이 props일 경우,
λ§€ λ Œλ”λ§λ§ˆλ‹€ μƒˆλ‘œμš΄ μ°Έμ‘°κ°€ μƒκΈ°λ―€λ‘œ νš¨κ³Όκ°€ μ—†μŒ β†’ useMemo둜 μ°Έμ‘°κ°’ μœ μ§€ ν•„μš”



βœ… μ„Έ κ°€μ§€ μ‘°ν•© μ‚¬μš© μ˜ˆμ‹œ

const Child = React.memo(({ onClick }) => {
  console.log("Child Rendered");
  return <button onClick={onClick}>Click</button>;
});

export default function Parent() {
  const [count, setCount] = useState(0);

  const handleClick = useCallback(() => {
    console.log("clicked");
  }, []);

  return (
    <>
      <div>{count}</div>
      <button onClick={() => setCount((c) => c + 1)}>증가</button>
      <Child onClick={handleClick} />
    </>
  );
}
  • ChildλŠ” React.memo둜 감싸져 있고,
    onClick은 useCallback으둜 λ©”λͺ¨μ΄μ œμ΄μ…˜λ˜μ–΄,
    countκ°€ λ°”λ€Œμ–΄λ„ ChildλŠ” λ¦¬λ Œλ”λ§λ˜μ§€ μ•ŠμŒ
    β†’ ✨ μ„Έ κ°€μ§€μ˜ μ΅œμ ν™” 방식이 잘 μ‘°ν•©λœ 예
profile
λ‚΄κ°€ 보렀고 λ§Œλ“  벨둜그 *'-'*

0개의 λŒ“κΈ€