
React는 기본적으로 매우 빠르지만, 프로젝트 규모가 커질수록 사소한 리렌더링도 성능 저하를 불러올 수 있다. 이런 불필요한 렌더링을 방지하고 컴포넌트 성능을 최적화하는 방법으로 다음의 3가지를 흔히 사용하고 있다.
useCallbackuseMemoReact.memo들어는 봤는데...정확히 뭘까?
부모 컴포넌트에서 자식 컴포넌트에 함수를 props로 넘겨줄 때! 매번 새로운 함수가 생성되면 자식 컴포넌트도 리렌더링 되기 때문에 useCallback을 사용해 함수를 캐싱해둘 수 있다.
// 기본 사용법
const memoizedCallback = useCallback(() => {
// 실행할 함수 내용
}, [dependencies]);
계산량이 많은 함수가 리렌더링때마다 매번 실행되면 느려질 수 있다. 이때 useMemo를 사용하면 값을 캐싱해두었다가 필요할 때만 다시 계산해준다.
// 기본 사용법
const result = useMemo(() => {
console.log("복잡한 계산 실행");
return fibonacci(num);
}, [num]);
부모가 리렌더링되더라도 props가 변하지 않는다면 자식 컴포넌트는 리렌더링되지 않게 할수 있다.
const Child = React.memo(({ name }: { name: string }) => {
console.log("Child 렌더링");
return <div>안녕, {name}</div>;
});
과도한 최적화는 오히려 독이 될 수 있다. 불필요한 useMemo나 useCallback 사용은 오히려 성능을 저하시킬 수도 있다! 또한, 사용할때 의존성 배열 관리에 주의해야한다.
⭐️⭐️⭐️
React19에서React Compiler가 도입되면서useCallback, useMemo없이 자동으로 의존성을 추적해 메모이제이션 해주는 기능이 생겼습니다.
자동으로 불필요한 렌더링 방지를 해준다니...그러나!React Compiler가 모든 경우에 100% 정확한 메모이제이션을 보장하진 않으므로 복잡한 연산 등에는 수동으로 써주는게 안전할 수도 있다고 합니다