# [[React 기반 대규모 웹 애플리케이션 최적화]]

## 📌[[ brief]] Summary
React 기반 대규모 웹 애플리케이션 최적화는 브라우저의 렌더링 과정(CRP)과 React의 가상 DOM([[Virtual DOM]]) 및 재조정([[Reconciliation]]) 메커니즘을 이해하여 불필요한 연산과 DOM 변경을 최소화하는 전략입니다 [1-3]. 이를 위해 메모이제이션, 코드 스플리팅, 가상화(Virtualization) 등의 클라이언트 측 기법과, Fiber 아키텍처를 통한 동시성 렌더링([[Concurrent Rendering]])을 활용하여 UI 응답성을 유지합니다 [4-7]. 또한, SSR, SSG와 같은 렌더링 방식과 React 서버 컴포넌트(RSC) 및 [[React Compiler]]를 결합하여 자바스크립트 번들 크기를 대폭 줄이고 초기 로딩 속도와 상호작용성을 극대화합니다 [8-11].

## 📖 Core Content

*   **브라우저 렌더링 과정과 Reflow/Repaint 최소화**
    브라우저는 HTML과 CSS를 파싱하여 DOM과 [[CSSOM]]을 생성하고, 이를 결합하여 화면에 표시될 렌더 트리([[Render Tree]])를 구축합니다 [3, 12-14]. 이후 요소의 정확한 크기와 위치를 계산하는 레이아웃(Reflow) 단계와 화면에 픽셀을 그리는 페인트(Repaint) 단계를 거칩니다 [15-18]. 리플로우는 계산 비용이 매우 높아 성능 저하의 주원인이 되므로, 불필요한 DOM 깊이를 줄이고 DOM 상호작용을 최소화해야 합니다 [19-21]. 애니메이션 처리 시 `top`이나 `left` 대신 `transform`과 같이 GPU 가속을 지원하는 속성을 사용하면 리플로우와 리페인트를 최소화하여 프레임 드롭(Jank)을 방지할 수 있습니다 [16, 22, 23].

*   **가상 DOM(Virtual DOM)과 재조정(Reconciliation)**
    React는 실제 DOM을 직접 조작하는 대신, 가벼운 메모리 내 표현인 가상 DOM을 사용하여 UI 상태를 선언적으로 관리합니다 [2, 24, 25]. 상태가 변경되면 React는 이전 가상 DOM 트리와 새로운 트리를 비교(Diffing)하여 실제 DOM에 필요한 최소한의 업데이트만 반영합니다 [2, 26]. 이 과정에서 React는 O(n) 복잡도의 휴리스틱 알고리즘을 사용하며, 요소의 타입이 다르면 트리를 완전히 새로 구축하고, 동일한 타입의 리스트 컴포넌트는 고유한 `key` 속성을 통해 요소의 이동 여부를 식별하여 불필요한 재생성을 방지합니다 [27-29].

*   **Fiber 아키텍처와 동시성 렌더링(Concurrent Rendering)**
    기존의 동기식 렌더링은 대규모 컴포넌트 트리를 처리할 때 메인 스레드를 블로킹하여 UI 응답성을 떨어뜨렸습니다 [30]. 이를 해결하기 위해 도입된 Fiber 아키텍처는 렌더링 작업을 '작업 단위(Unit of Work)'로 나누어 타임 슬라이싱([[Time-Slicing]])을 가능하게 합니다 [30, 31]. 렌더 단계는 중단 및 재개가 가능하며, 차선(Lane) 기반 우선순위 모델을 통해 사용자 입력과 같은 긴급한 작업을 렌더링 계산보다 먼저 처리할 수 있습니다 [32-34]. [[React 19]]의 `[[useTransition]]` 및 `[[useDeferredValue]]` 훅을 활용하면 무거운 계산 상태 업데이트의 우선순위를 낮추어 메인 스레드를 차단하지 않고 대규모 데이터를 부드럽게 처리할 수 있습니다 [5, 35, 36].

*   **자동 일괄 처리([[Automatic Batching]])와 React Compiler**
    [[React 18]]에 도입된 자동 일괄 처리는 Promise나 setTimeout 같은 비동기 콜백 내의 여러 상태 업데이트를 단일 리렌더링으로 묶어 렌더링 횟수를 대폭 줄입니다 [37-39]. 나아가 React 19부터 안정화된 React Compiler는 빌드 타임에 AST(추상 구문 트리)를 분석하여 컴포넌트와 값의 의존성을 파악하고, `useMemo`, `useCallback`, `React.memo`와 같은 수동 메모이제이션을 자동으로 삽입합니다 [10, 11, 40]. 이를 통해 불필요한 렌더링 전파(Re-render Cascade)를 차단하고, 수동 최적화의 복잡성과 오류를 근본적으로 제거합니다 [10, 41, 42].

*   **컴포넌트 렌더링 전략 (CSR, SSR, SSG) 및 서버 컴포넌트(RSC)**
    대규모 애플리케이션에서는 페이지의 특성에 따라 렌더링 전략을 혼합(Hybrid)하여 사용합니다 [43, 44].
    *   **CSR/SSR/SSG:** 클라이언트 사이드 렌더링(CSR)은 로드 후 상호작용성이 좋으나 초기 속도가 느리고 SEO에 불리하며, 서버 사이드 렌더링(SSR)과 정적 사이트 생성(SSG)은 초기 로딩(FCP)과 SEO에 유리하지만 SSR의 경우 하이드레이션([[Hydration]]) 완료 전까지 상호작용(TTI)이 지연되는 단점이 있습니다 [8, 45-48].
    *   **React 서버 컴포넌트 (RSC):** RSC는 서버에서 독점적으로 렌더링되며 클라이언트로 자바스크립트 번들을 전혀 보내지 않습니다 [9, 49, 50]. 데이터베이스나 파일 시스템에 직접 접근할 수 있어 클라이언트-서버 간 불필요한 API 호출을 줄입니다 [51-53]. 대규모 앱에서는 읽기 전용 UI를 서버 컴포넌트로 처리하고, 상태나 이벤트 핸들러가 필요한 요소만 `use client` 지시어를 통해 클라이언트 컴포넌트로 분리함으로써 번들 크기를 극적으로 줄이고 성능을 최적화할 수 있습니다 [51, 54, 55].

## 🔗 Knowledge Connections
- **Related Topics:** [[Critical Rendering Path]], [[Virtual DOM]], [[Reconciliation]], [[Fiber Architecture]], [[React Server Components]], [[React Compiler]], [[Automatic Batching]]
- **Projects/Contexts:** 초기 로딩 및 SEO 최적화가 필수적인 대규모 이커머스 및 콘텐츠 플랫폼, 수천 개의 리스트와 실시간 데이터 처리가 필요한 대형 [[SaaS]] 대시보드 애플리케이션
- **Contradictions/Notes:** 수동 메모이제이션(`React.memo`, `useMemo`)은 리렌더링을 방지할 수 있지만 참조 객체 저장 및 비교 연산에 따른 자체적인 오버헤드가 발생하므로 모든 컴포넌트에 무분별하게 적용하는 것은 오히려 성능을 저하시키는 안티 패턴입니다 [42, 56]. 그러나 최신 React Compiler가 적용된 환경에서는 이러한 최적화 판단과 메모이제이션 삽입이 빌드 타임에 자동으로 이루어지므로 개발자가 수동으로 제어할 필요성이 크게 줄어들었습니다 [11, 57]. 또한, SSR은 빠른 초기 화면(FCP)을 제공하지만 하이드레이션 병목 현상으로 인해 상호작용(TTI)까지 지연 시간이 발생할 수 있으므로 주의가 필요합니다 [45, 48].

---
*Last updated: 2026-04-25*