πŸ‘©β€πŸŽ¨ μ΅œμ ν™” (useMemo, useCallback, React.memo)

κΉ€μˆ˜μ§„Β·2025λ…„ 7μ›” 20일

✨ μ΅œμ ν™”λž€?

λ™μΌν•œ κ²°κ³Όλ₯Ό 더 적은 μžμ›(CPU, λ©”λͺ¨λ¦¬, λ„€νŠΈμ›Œν¬ λ“±)으둜 λ§Œλ“€μ–΄λ‚΄λŠ” 기술적인 λ…Έλ ₯이닀.

ν”„λ‘ νŠΈμ—”λ“œμ—μ„œμ˜ μ΅œμ ν™”λŠ” λ‹¨μˆœνžˆ λΉ λ₯΄κ²Œ 보이게 ν•˜λŠ” 것뿐 μ•„λ‹ˆλΌ, μ‚¬μš©μž κ²½ν—˜(UX)을 ν–₯μƒμ‹œν‚€κ³ , λΆˆν•„μš”ν•œ 계산과 λ Œλ”λ§μ„ 쀄여 μ„±λŠ₯을 κ°œμ„ ν•˜λŠ” 것을 λͺ©ν‘œλ‘œ ν•œλ‹€.

πŸ”§ React μ΅œμ ν™” 방법 3κ°€μ§€

ReactλŠ” 기본적으둜 μƒνƒœλ‚˜ propsκ°€ 변경될 λ•Œ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‹€μ‹œ λ Œλ”λ§ν•œλ‹€. 이 κ³Όμ •μ—μ„œ λΆˆν•„μš”ν•œ μ—°μ‚°μ΄λ‚˜ ν•¨μˆ˜ 생성, λ¦¬λ Œλ”λ§μ΄ λ°œμƒν•˜λ©΄ μ•±μ˜ μ„±λŠ₯이 λ–¨μ–΄μ§ˆ 수 μžˆλ‹€. ReactλŠ” λ‹€μŒκ³Ό 같은 3κ°€μ§€μ˜ μ΅œμ ν™” 방법이 μžˆλ‹€!
1. μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ˜ λΆˆν•„μš”ν•œ 연산을 λ°©μ§€ν•œλ‹€. β†’ useMemo

  1. λΆˆν•„μš”ν•œ ν•¨μˆ˜ μž¬μƒμ„±μ„ λ§‰λŠ”λ‹€. β†’ useCallback

  2. μ»΄ν¬λ„ŒνŠΈμ˜ λΆˆν•„μš”ν•œ λ¦¬λ Œλ”λ§μ„ λ§‰λŠ”λ‹€. β†’ React.memo

πŸ“¦ propsλž€?

μ»΄ν¬λ„ŒνŠΈ μ™ΈλΆ€μ—μ„œ λ‚΄λΆ€λ‘œ 값을 μ „λ‹¬ν•΄μ£ΌλŠ” 방법이닀.

function SayHello(props) {
  return <p>μ•ˆλ…•ν•˜μ„Έμš”, {props.name}λ‹˜!</p>;
}

<SayHello name="μˆ˜μ§„" />

sayHello("μˆ˜μ§„")μ—μ„œ "μˆ˜μ§„"은 <SayHello name="μˆ˜μ§„" /> 의 props인 name에 ν•΄λ‹Ήν•˜λŠ” 값이닀.

1. useMemo

λ³΅μž‘ν•œ 계산 κ²°κ³Όλ₯Ό κΈ°μ–΅ν•΄μ„œ, λΆˆν•„μš”ν•˜κ²Œ λ‹€μ‹œ κ³„μ‚°ν•˜μ§€ μ•Šλ„λ‘ λ§‰μ•„μ£ΌλŠ” React 훅이닀.
μ—°μ‚°λŸ‰μ΄ λ§Žμ€ μž‘μ—…μ—μ„œ μ»΄ν¬λ„ŒνŠΈκ°€ λ¦¬λ Œλ”λ§λ  λ•Œλ§ˆλ‹€ 계산이 λ°˜λ³΅λ˜λŠ”κ²Œ 아깝닀고 느껴질 λ•Œ μ‚¬μš©ν•œλ‹€.

const memoizedValue = useMemo(() => {
  // λ³΅μž‘ν•œ μ—°μ‚°
  return 계산결과;
}, [μ˜μ‘΄κ°’]);

μ˜μ‘΄κ°’μ΄ λ°”λ€” λ•Œλ§Œ ν•¨μˆ˜λ₯Ό λ‹€μ‹œ μ‹€ν–‰ν•˜κ³ , λ°”λ€Œμ§€ μ•ŠμœΌλ©΄ 이전 κ²°κ³Όλ₯Ό μž¬μ‚¬μš©ν•œλ‹€.

2. useCallback

ν•¨μˆ˜λ₯Ό κΈ°μ–΅ν•΄μ„œ, λΆˆν•„μš”ν•˜κ²Œ 맀번 μƒˆλ‘œ λ§Œλ“€μ–΄μ§€λŠ” κ±Έ λ°©μ§€ν•˜λŠ” React 훅이닀.
ν•¨μˆ˜κ°€ μžμ‹μ»΄ν¬λ„ŒνŠΈμ— props둜 μ „λ‹¬λ˜λ©΄ μžμ‹ μ»΄ν¬λ„ŒνŠΈλ„ λΆˆν•„μš”ν•˜κ²Œ λ¦¬λ Œλ”λ§ 될 수 μžˆλ‹€. useCallbackλ₯Ό μ‚¬μš©ν•˜λ©΄, ν•¨μˆ˜μ˜ μ°Έμ‘°λ₯Ό μœ μ§€ν•΄μ„œ λ¦¬λ Œλ”λ§μ„ μ΅œμ ν™”ν•  수 μžˆλ‹€.

const memoizedFunction = useCallback(() => {
  // ν•¨μˆ˜ 둜직
}, [μ˜μ‘΄κ°’]);

μ˜μ‘΄κ°’μ΄ λ°”λ€Œμ§€ μ•ŠμœΌλ©΄ ν•¨μˆ˜λŠ” 이전 κ·ΈλŒ€λ‘œ μž¬μ‚¬μš©λœλ‹€. React.memo와 ν•¨κ»˜ μ“°λ©΄ μžμ‹ μ»΄ν¬λ„ŒνŠΈμ˜ λ¦¬λ Œλ”λ§μ„ λ°©μ§€ν•  수 μžˆλ‹€.

3. React.memo

μ»΄ν¬λ„ŒνŠΈλ₯Ό κΈ°μ–΅ν•΄μ„œ, propsκ°€ λ°”λ€Œμ§€ μ•ŠμœΌλ©΄ λ¦¬λ Œλ”λ§μ„ λ§‰μ•„μ£ΌλŠ” κ³ μ°¨ μ»΄ν¬λ„ŒνŠΈμ΄λ‹€.
μžμ‹ μ»΄ν¬λ„ŒνŠΈκ°€ propsκ°€ λ°”λ€Œμ§€ μ•Šμ•˜λŠ”λ°λ„ 계속 λ Œλ”λ§λ  수 μžˆλ‹€.
React.memoλ₯Ό μ‚¬μš©ν•˜λ©΄, propsκ°€ λ°”λ€Œμ§€ μ•ŠλŠ” ν•œ λ¦¬λ Œλ”λ§μ„ μƒλž΅ν•  수 μžˆλ‹€.

const MemoizedComponent = React.memo(MyComponent);

MyComponentλ₯Ό κΈ°μ–΅λœ μ»΄ν¬λ„ŒνŠΈλ‘œ λ§Œλ“€μ–΄ propsκ°€ λ°”λ€Œμ§€ μ•ŠμœΌλ©΄ λ‹€μ‹œ λ Œλ”λ§ν•˜μ§€ μ•Šλ„λ‘ ν•˜λŠ” 방식이닀.

✍️ λŠλ‚€μ 

ν”„λ‘ νŠΈμ—”λ“œ κ°œλ°œμ„ 처음 μ‹œμž‘ν–ˆμ„ λ•ŒλŠ”, 화면에 λ‚΄κ°€ μ›ν•˜λŠ” UIκ°€ 잘 보이기만 ν•˜λ©΄ 끝이라고 μƒκ°ν–ˆμ—ˆμ—ˆλ‹€. 그런데 μš”μ¦˜ μ‹€μ œ ν”„λ‘œμ νŠΈλ₯Ό ν•΄λ³΄λ©΄μ„œ, 화면에 아무 이상 μ—†μ–΄ 보여도 κ·Έ μ•ˆμ—μ„œ λΆˆν•„μš”ν•œ λ Œλ”λ§μ΄λ‚˜ 계산이 계속 λ°œμƒν•˜κ³  μžˆλ‹€λŠ” 것을 κΉ¨λ‹«κ²Œ λ˜μ—ˆλ‹€. μ΄λŸ¬ν•œ 것듀이 μŒ“μ΄λ©΄ κ²°κ΅­ μ‚¬μš©μž κ²½ν—˜μ— μ’‹μ§€ μ•Šμ€ 영ν–₯을 쀄 수 μžˆλ‹€λŠ” 것도 μ•Œκ²Œ λ˜μ—ˆλ‹€.

μ΄λ²ˆμ— useMemo, useCallback, React.memo 같은 μ΅œμ ν™” 기법을 λ°°μš°λ©΄μ„œ,
μ‚¬μš©μžμ—κ²Œ 더 쒋은 κ²½ν—˜μ„ μ£ΌκΈ° μœ„ν•œ λ…Έλ ₯을 ν•΄μ•Όκ² λ‹€λŠ” 생각이 λ“€μ—ˆλ‹€.

아직은 μ΅μˆ™ν•˜μ§€ μ•Šμ€ 뢀뢄도 μžˆμ§€λ§Œ...., μ•žμœΌλ‘œλŠ” λ‹¨μˆœνžˆ κΈ°λŠ₯만 κ΅¬ν˜„ν•˜λŠ” κ°œλ°œμžκ°€ μ•„λ‹ˆλΌ λΆˆν•„μš”ν•œ μ—°μ‚°κ³Ό λ¦¬λ Œλ”λ§μ„ μ˜μ‹ν•˜κ³ , 더 λ‚˜μ€ μ„±λŠ₯을 μœ„ν•΄ κ³ λ―Όν•˜λŠ” κ°œλ°œμžκ°€ λ˜μ–΄μ•Όκ² λ‹€λŠ” 생각이 λ“€μ—ˆλ‹€.

2개의 λŒ“κΈ€

comment-user-thumbnail
2025λ…„ 7μ›” 24일

이미 λ¦¬μ•‘νŠΈλ₯Ό ν†΅λ‹¬ν•˜μ…¨κ΅°μš”.

λ‹΅κΈ€ 달기
comment-user-thumbnail
2025λ…„ 7μ›” 27일

아직 μ΅œμ ν™”κΉŒμ§€ μ‹ κ²½ μ“΄ 적이 μ—†λŠ”λ°..μ•žμœΌλ‘œ κ°œλ°œν•˜λ©΄μ„œ ν•œλ²ˆ κ³ λ €ν•΄λ΄μ•Όκ² μ–΄μš”

λ‹΅κΈ€ 달기