프레임워크\라이브러리/React
[Hook] useMemo, useCallback
thinktank911
2025. 12. 1. 16:19
useMemo와 useCallback은 불필요한 렌더링 및 연산 비용을 줄이기 위해 사용하는 리액트의 최적화 훅이지만,
사용하는 목적과 반환값이 다르다.
🔹 useMemo
📌 개념
- 값(value)을 메모이제이션(memoization)하는 훅
- 계산 비용이 큰 연산 결과를 재사용하기 위해 사용
- 의존성 배열(deps)이 변경될 때만 다시 계산
📌 문법
const memoizedValue = useMemo(() => {
return computeHeavy(value);
}, [value]);
📌 언제 사용?
- 계산 비용이 큰 함수 실행 결과를 저장하고 싶을 때
- 렌더링마다 재계산되면 비효율적일 때
📌 예시
const sum = useMemo(() => {
console.log("계산중...");
return numbers.reduce((a, b) => a + b, 0);
}, [numbers]);
➡️ numbers가 바뀌지 않는 한 재계산되지 않음.
🔹 useCallback
📌 개념
- 함수(function)를 메모이제이션하는 훅
- 동일한 함수를 유지해야 할 때 사용
📌 문법
const memoizedCallback = useCallback(() => {
doSomething(a, b);
}, [a, b]);
📌 언제 사용?
- 자식 컴포넌트에 함수를 props로 넘겨줄 때
- 렌더링마다 새 함수가 생성되어 불필요하게 자식 컴포넌트가 렌더링될 때 방지
📌 예시
const handleClick = useCallback(() => {
setCount(prev => prev + 1);
}, []);
🔥 차이점 요약 (한눈에 보기)
| Hook | 메모이제이션 대상 | 반환값 | 사용 시점 |
| useMemo | 값 (연산 결과) | 결과값 | 계산 비용이 큰 연산 최적화 |
| useCallback | 함수 | 함수 | props로 전달하는 함수의 재생성 방지 |
💬 이해하기 쉽게 비유
| Hook | 비유 |
| useMemo | 계산이 오래 걸리는 요리 → 만들어두고 재사용 |
| useCallback | 동일한 요리 레시피(함수) → 매번 종이 새로 쓰지 않고 저장해둔 레시피 사용 |
⚠️ 주의할 점
- 두 훅 모두 남발하면 오히려 성능이 나빠질 수 있음
- 계산/함수 재사용에 "비용이 큰 경우"에만 사용
- props로 넘기는 콜백 때문에 자식 컴포넌트가 자주 렌더링될 때 특히 효과적
🚀 핵심 정리
useMemo는 값을 캐싱,
useCallback은 함수를 캐싱한다.
둘 모두 성능 최적화가 필요할 때만 선택적으로 사용하는 훅이다.