React에서 useCallback과 useMemo는 성능 최적화를 위한 훅(Hook)으로, 불필요한 렌더링과 연산을 방지하는 역할을 한다.
콜백 함수의 메모이제이션을 수행하여 불필요한 함수 재생성을 방지하는 훅이다.
메모이제이션(Memoization)?
컴퓨터 알고리즘 용어로, 동일한 계산을 반복해야 할 경우 한 번 계산한 결과를 메모리에 저장해 두었다가 꺼내 씀으로써 중복 계산을 방지할 수 있게 하는 기법이다
import {useCallback, useState } from "react";
const MyComp = ()=>{
const [count,setCount] = useState(0);
//🔴 함수가 매번 새로 생성됨
//const increment = ()=> setCount(count+1);
//🟢 useCallback을 사용 → count가 변경될 때만 새로운 함수 생성
const increment = useCallback(()=>{
setCount((prev)=>prev+1);
},[]);
return(
<div>
<p>Count : {count} </p>
<button onClick ={increment}>증가</button>
</div>
);
};
import { useMemo, useState } from "react"
const MyComp = () => {
const [count, setCount] = useState(0);
const [number,setNumber] = useState(10);
//🔴 number가 바뀔 때만 연산해야 하는데 매번 연산이 수행됨
//const Result = slowFunction(number);
//🟢 useMemo 사용 → number가 변경될 때만 연산 수행
const Result = useMemo(()=> slowFunction(number),[number]);
function slowFunction(num){
console.log("s...l...o....w.....);
return num*2 ;
}
return(
<div>
<h2> Result : {Result} </h2>
<button onClick={() => setCount(count + 1)}>Increase Count</button>
<button onClick={() => setNumber(number + 1)}>Change Number</button>
</div>
);
| useCallback | useMemo | |
|---|---|---|
| 기능 | 함수 자체를 캐싱 | 계산된 값을 캐싱 |
| 리턴 값 | 메모이제이션된 함수 | 메모이제이션된 값 |
| 언제 사용? | 콜백 함수가 매번 새로 생성되는 것을 방지할 때 | 연산량이 큰 작업의 불필요한 반복을 방지할 때 |
useCallback과 useMemo 같이 사용하기
import { useCallback, useMemo, useState } from "react";
const Example = () => {
const [count, setCount] = useState(0);
const [items, setItems] = useState([1, 2, 3, 4, 5]);
// ✅ useMemo → items 배열을 필터링한 결과를 메모이제이션
const filteredItems = useMemo(() => {
console.log("필터링 실행!");
return items.filter((item) => item % 2 === 0);
}, [items]);
// ✅ useCallback → setCount 함수가 렌더링마다 새로 생성되는 것을 방지
const increment = useCallback(() => {
setCount((prev) => prev + 1);
}, []);
return (
<div>
<h2>Count: {count}</h2>
<button onClick={increment}>+</button>
<h2>Filtered Items: {filteredItems.join(", ")}</h2>
</div>
);
};
📌 👉 핵심은 "진짜 필요한 곳에서만 사용"하는 것!