
React는 기본적으로 빠른 UI를 제공하지만, 컴포넌트 수가 많아지고 복잡한 연산이 늘어날수록
불필요한 렌더링이나 초기 로딩 시간이 성능 저하를 일으킬 수 있다.
이럴 때 사용할 수 있는 주요 성능 최적화 기법들을 정리해보자!
React.memo – 컴포넌트 메모이제이션props가 변경되지 않았다면 리렌더링을 막는 고차 컴포넌트(HOC)
import React from 'react';
const MyComponent = React.memo(function MyComponent({ text }) {
console.log("렌더링!");
return <div>{text}</div>;
});
memo를 사용하면 불필요한 렌더링을 막아주기 때문에 렌더링 비용이 큰 컴포넌트에서 특히 유용하다.
useCallback & useMemo - 함수와 값을 메모제이션useCallback - 함수를 메모제이션const handleClick = useCallback() => {
console.log("클릭됨");
}, []);
props로 넘길 때 유용useMemo - 계산된 값을 메모제이션const result = useMemo(() =>{
return heavyCalculation(a,b);
}, [a,b])
const Child = React.memo(({onClick}) => {
console.log("Child 렌더링");
return <button onClick={onClick}>클릭</button>
});
function Parent() {
const [count, setCount] = useState(0);
const handleClick = useCallback(() => {
console.log("Clicked")!
}, []);
return (
<>
<Child onClick={handleClick} />
<button onClick={() => setCount(count + 1)}>+1</button>
</>
)
}
애플리케이션을 여러 개의 청크(조각)로 분할하여
필요한 시점에만 로딩 -> 초기 로딩 시간 단축!!
React.lazy() - 동적으로 컴포넌트를 로드Suspense - 로딩 중 fallback UI 표시import React, {Suspense, lazy} from 'react';
const LazyComponent = lazy(() => import('./MyComponent'));
function App() {
return (
<Suspense fallback={<div>로딩 중...</div>}>
<LazyComponent/>
</Suspense>
)
}
MyComponent는 실제로 화면에서 필요할 때 비동기적으로 로드된다.
-> 초기 렌더링에서는 불필요한 코드가 제외되므로 성능 향상!
const Home = lazy(() => import('./pages/Home'));
const About = lazy(() => import('./pages/About'));
React의 성능 최적화는 단순히 렌더링을 줄이는 것을 넘어서
전체 앱의 구조, 사용자 경험까지 고려한 설계가 필요하다.
다음에는 고급 성능 전략도 이어서 정리해보도록 하자!