React에서 함수가 매번 새로 만들어지는 것을 방지하기 위해 사용하는 Hook이다.
원형
const memoizedFn = useCallback(fn, deps);
| 항목 | 설명 |
|---|---|
useCallback | 함수를 메모이제이션(캐싱) 하여 불필요한 재생성을 방지하는 React Hook |
| 언제 사용? | 특정 함수가 자식 컴포넌트로 전달되거나 의존성에 민감한 작업을 수행할 때 |
의존성 배열 [] | 배열이 비어 있으면 → 해당 함수는 최초 렌더링 시 한 번만 생성되며, 이후 재생성되지 않음 |
React 함수형 컴포넌트는 렌더링될 때마다 전체 함수 본문이 다시 실행되므로, 함수 안에 선언한 함수들도 항상 새로 만들어짐.
function App() {
const handleClick = () => {
console.log('clicked');
};
return <button onClick={handleClick}>Click</button>;
}
<Child onClick={handleClick} />
➡️ 이럴 때 useCallback으로 감싸면 이전 함수와 동일하다고 인식해서 렌더링 최적화 가능
const memoizedFn = useCallback(() => {
// 어떤 작업
}, [의존값1, 의존값2]);
const fetchData = useCallback(async () => {
try {
const res = await fetch('/api/data');
const data = await res.json();
// ...
} catch (error) {
console.error(error);
}
}, []);
fetchData 함수는 반드시 Promise를 반환한다.
내부에 await로 비동기 흐름을 동기적으로 쪼깨고, return data로 data를 꺼낼 때도 자동으로 Promise.resolve(data) 상태로 넘어감.