React 애플리케이션의 성능 최적화는 사용자 경험에 직접적인 영향을 미치는 중요한 요소다. 면접에서 자주 등장하는 질문들을 기준으로 각 최적화 기법을 분석하고, 실무에서 어떻게 적용할 수 있는지 비교해 보자.
React.memo: 컴포넌트의 리렌더링을 방지하는 고차 컴포넌트(HOC)로, props가 변하지 않으면 컴포넌트를 다시 렌더링하지 않는다. 하지만 props가 객체나 함수를 포함할 경우 레퍼런스가 매번 새로 생성되므로 useMemo
나 useCallback
과 같이 메모이제이션 기법을 활용해야 효과적이다.
useMemo: 연산량이 큰 작업의 결과를 메모이제이션해, 특정 값이 변경될 때만 다시 계산하도록 한다. 주로 리턴 값이 객체나 배열일 때 많이 사용된다.
useCallback: 함수의 메모이제이션을 위해 사용되며, 자식 컴포넌트로 함수를 props로 전달할 때 유용하다.
컴포넌트 상태 최소화: 불필요한 상태가 많으면 컴포넌트가 자주 리렌더링된다. 상태는 가능하면 컴포넌트 내부에 두지 않고 상위 컴포넌트나 전역 상태로 관리하는 것이 좋다.
shouldComponentUpdate: 클래스 컴포넌트에서 리렌더링 여부를 결정하는 메서드로, props나 state가 변경될 때마다 호출된다. PureComponent
로 대체 가능하며, 내부적으로 얕은 비교를 한다.
필요성: 대규모 애플리케이션에서 모든 코드를 한 번에 로드하면 초기 로딩 속도가 느려진다. 이를 해결하기 위해 필요한 부분만 로드하는 방식이다.
방법: React의 React.lazy
와 Suspense
를 활용해 페이지나 특정 컴포넌트를 동적으로 로드한다.
const LazyComponent = React.lazy(() => import('./LazyComponent'));
function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<LazyComponent />
</Suspense>
);
}
useMemo
나 useCallback
을 함께 사용해야 효과적이다.