4.9 KiB
4.9 KiB
Performance Optimization
📌 Brief Summary
성능 최적화(Performance Optimization)는 프런트엔드 애플리케이션의 렌더링 속도, 네트워크 로딩 시간, 그리고 메모리 사용량을 개선하여 원활한 사용자 경험을 제공하는 핵심 과정입니다. React 생태계에서는 불필요한 리렌더링 방지, 코드 스플리팅, 효율적인 상태 관리, 가상화(Virtualization) 기법 도입 등을 통해 확장 가능하고(scalable) 빠른 웹 애플리케이션을 구축합니다. 최적화를 적용하기 전에는 항상 프로파일링 도구를 통해 병목 현상을 먼저 측정하고 분석하는 것이 원칙입니다.
📖 Core Content
-
렌더링 및 메모이제이션 최적화
- React에서 컴포넌트는 상태, props, 컨텍스트가 변경되거나 부모 컴포넌트가 렌더링될 때 리렌더링됩니다 [1]. 불필요한 리렌더링을 막기 위해
React.memo(),useCallback,useMemo를 사용할 수 있지만, 얕은 비교(shallow comparison)나 객체 생성 비용 등의 오버헤드가 발생할 수 있으므로 반드시 측정 후 도입해야 합니다 [2-4]. - JSX 내부의 익명 함수는 렌더링마다 새로운 참조를 생성하여 자식 컴포넌트의 리렌더링을 유발하므로 피하는 것이 좋습니다 [5].
- 2025년에 안정화된 React Compiler를 도입하면, 수동으로 메모이제이션을 추가할 필요 없이 빌드 타임에 컴파일러가 자동으로 JSX 요소와 연산을 캐싱하여 코드를 깔끔하게 유지할 수 있습니다 [6-8].
- React에서 컴포넌트는 상태, props, 컨텍스트가 변경되거나 부모 컴포넌트가 렌더링될 때 리렌더링됩니다 [1]. 불필요한 리렌더링을 막기 위해
-
코드 스플리팅 및 번들 크기 축소
- 초기 로드 속도를 개선하기 위해 거대한 JavaScript 번들을 작게 나누는 코드 스플리팅(Code Splitting)이 필수적입니다 [9, 10].
- Vite 환경에서는
manualChunks를 설정하여 거의 변경되지 않는 무거운 벤더 라이브러리(예: React 코어, 차트 라이브러리)를 별도의 파일로 분리하고, 브라우저 캐싱을 극대화합니다 [11, 12]. - 개별 라우트나 무거운 UI 위젯은
React.lazy()와<Suspense>를 결합해 사용자가 접근할 때만 동적으로 지연 로딩(Lazy Loading)되도록 구현합니다 [12-14].
-
효율적인 상태 관리와 리렌더링 제어
- React의 기본 Context API는 내부의 특정 값 하나만 변경되어도 해당 컨텍스트를 구독하는 모든 하위 컴포넌트를 리렌더링하는 문제가 있습니다 [15, 16].
- 이를 방지하기 위해 컨텍스트를 도메인별로 작게 쪼개거나, 필요한 상태 조각(slice)만 구독할 수 있는 Selector 패턴을 지원하는 Zustand, Jotai 같은 상태 관리 라이브러리를 활용하는 것이 대규모 애플리케이션 성능 관리에 유리합니다 [17-20].
-
대규모 리스트 렌더링과 동시성(Concurrent) 기능
- 수백 개 이상의 항목을 렌더링해야 하는 리스트는 DOM 비대화(DOM bloat)를 초래하므로, 화면에 보이는 항목만 렌더링하는 가상화(Windowing/Virtualization) 라이브러리(예:
react-window)를 사용해야 하며, 리스트 렌더링 시에는 항상 안정적이고 고유한key를 부여해야 합니다 [21-23]. - React의
useTransition과useDeferredValue훅을 활용하면 데이터 필터링 같은 무거운 렌더링 작업을 지연시키고, 사용자 입력 등 더 중요한 상호작용의 우선순위를 높여 UI의 반응성을 유지할 수 있습니다 [24-26].
- 수백 개 이상의 항목을 렌더링해야 하는 리스트는 DOM 비대화(DOM bloat)를 초래하므로, 화면에 보이는 항목만 렌더링하는 가상화(Windowing/Virtualization) 라이브러리(예:
-
모니터링 및 메모리 누수 디버깅
- 최적화는 측정에서 시작됩니다. React DevTools Profiler, Chrome DevTools,
why-did-you-render등을 사용해 렌더링 시간과 병목을 파악하고 Core Web Vitals(LCP, INP, CLS 등)를 모니터링해야 합니다 [27-30]. - JavaScript 메모리 누수(예: 분리된 DOM 노드, 정리되지 않은 이벤트 리스너)는 성능을 지속적으로 저하시킵니다. 이를 해결하기 위해 Chrome DevTools의 Heap Snapshot이나 Allocation Timeline 기능을 사용해 메모리를 반환하지 못하는 객체를 찾아내야 합니다 [31-34].
- 최적화는 측정에서 시작됩니다. React DevTools Profiler, Chrome DevTools,
🔗 Knowledge Connections
- Related Topics: React Architecture, State Management, Clean Code, Debugging, Vite and Bundling
- Projects/Contexts: 대규모 React 애플리케이션 개발, Next.js 및 Server Components 적용 프로젝트, 웹 성능 최적화(Core Web Vitals) 개선 작업
- Contradictions/Notes: 소스에 따르면, 메모이제이션(
React.memo,useCallback등)은 무조건 성능을 향상시키는 것이 아니라, 컴포넌트 렌더링이 매우 빠르거나 props가 빈번하게 변경되는 경우에는 상태 비교(comparison) 비용이 렌더링 비용보다 커져 오히려 성능을 저하시킬 수 있으므로 프로파일링을 통한 측정이 우선되어야 한다고 경고합니다 [3, 35].
Last updated: 2026-04-26