useMemo 는 무료가 아니다. 의존성 비교 + 클로저 유지 비용. 참조 동일성이 진짜 필요할 때만 또는 계산이 진짜 비싼 경우만 쓴다.
📖 핵심 개념
useMemo 는 두 가지 목적:
참조 동일성 보장: 자식의 useEffect/useMemo deps 또는 React.memo 비교에 사용
고비용 계산 캐시: 매 렌더 다시 계산 안 함
이 둘이 아니면 useMemo 는 오히려 메모리 + 비교 비용만 추가.
💻 코드 패턴
// ✅ 자식 useEffect deps 안정화
constconfig=useMemo(()=>({id,mode}),[id,mode]);useChildHook(config);// config 가 매 렌더 새 객체면 자식 effect 무한 trigger
// ✅ 진짜 비싼 계산
constsorted=useMemo(()=>bigArray.slice().sort(cmp),[bigArray]);// ❌ 단순 변환 — useMemo 비용이 더 큼
constupper=useMemo(()=>name.toUpperCase(),[name]);
🤔 의사결정 기준
상황
useMemo
자식 props 가 객체/배열, React.memo 적용 자식
✅
자식의 useEffect deps 로 들어감
✅
정렬·필터 등 O(n log n) 이상 계산, n>1000
✅
단순 string 변환, 산술
❌ (useMemo 비용 > 계산 비용)
이미 useState 의 setState lazy init 으로 충분
❌
❌ 안티패턴
모든 계산에 useMemo: cargo cult. 99% 의 useMemo 는 이득 < 비용.
deps 에 객체 리터럴: useMemo(() => foo(opts), [{ a: 1 }]) — 매번 새 객체, 영원히 미스.
side effect in factory: useMemo 는 pure 가정. fetch / setState 넣으면 React 가 임의 실행 가능.
React.memo 없이 props 안정화만 위해 useMemo: 자식이 memoized 안 되면 의미 없음.
실측 안 한 최적화: Profiler 로 측정 후 결정.
🤖 LLM 활용 힌트
"useMemo 는 (a) React.memo 자식 props 안정화 또는 (b) 측정된 비싼 계산만" 명시.