Update: 2026-04-30 22:59
This commit is contained in:
@@ -1,35 +1,42 @@
|
||||
# [[React [[Frontend]] Development]]
|
||||
|
||||
## 📌[[ brief]] Summary
|
||||
React는 가상 DOM([[Virtual DOM]])과 컴포넌트 기반 아키텍처(CBA)를 활용하여 사용자 인터페이스를 효율적이고 선언적으로 구축하는 프론트엔드 라이브러리입니다 [1-3]. 브라우저의 비용이 많이 드는 Reflow와 Repaint 작업을 최소화하기 위해 '재조정([[Reconciliation]])' 알고리즘을 사용하며, 최신 버전에서는 Fiber 아키텍처와 자동 메모이제이션([[React Compiler]])을 통해 렌더링 성능을 극대화합니다 [1, 3-5]. 또한, 애플리케이션의 특성에 맞춰 CSR, SSR, SSG 및 [[React Server Components]](RSC) 등 다양한 렌더링 전략을 지원하여 초기 로딩 속도, SEO, 상호작용(Interactivity)의 균형을 맞춥니다 [6-9].
|
||||
## 📌 Brief Summary
|
||||
React 프론트엔드 개발은 컴포넌트 기반 아키텍처를 통해 현대적인 웹 사용자 인터페이스를 구축하는 공정이다. 비즈니스 기능 중심의 폴더 구조(FSD), 계층화된 상태 관리, 그리고 자동화된 성능 최적화와 에러 핸들링을 결합하여 유지보수 가능하고 확장성 있는 시스템을 구축하는 것을 목표로 한다.
|
||||
|
||||
## 📖 Core Content
|
||||
* **브라우저 렌더링 과정 (CRP) 및 비용 최소화**
|
||||
브라우저의 중요 렌더링 경로([[Critical Rendering Path]])는 HTML과 CSS를 파싱하여 DOM과 [[CSSOM]] 트리를 생성하고, 이를 결합해 렌더 트리([[Render Tree]])를 만듭니다 [10, 11]. 이후 요소의 정확한 위치와 크기를 계산하는 레이아웃(Reflow) 단계와 화면에 픽셀을 그리는 페인트(Repaint) 단계를 거칩니다 [12, 13]. Reflow는 연산 비용이 매우 높으며, 잦은 Reflow와 Repaint는 성능 저하를 유발하므로 DOM 접근과 조작을 최소화하는 것이 필수적입니다 [14-16].
|
||||
1. **아키텍처 및 설계 원칙**
|
||||
- **FSD (Feature-Sliced Design)**: 도메인 계층화와 단방향 의존성을 통해 시스템 결합도를 낮춘다.
|
||||
- **SOLID & Clean Code**: 단일 책임 원칙(SRP)을 기반으로 비대해진 로직을 커스텀 훅으로 추출하여 캡슐화한다.
|
||||
2. **세분화된 상태 관리**
|
||||
- 정적/글로벌 상태(Context), 빈번한 업데이트(Zustand), 서버 동기화(TanStack Query)로 역할을 분리하여 리렌더링 성능을 극대화한다.
|
||||
3. **성능 및 리소스 최적화**
|
||||
- **React Compiler**: 빌드 타임 자동 메모이제이션을 통해 수동 최적화의 인적 오류를 줄인다.
|
||||
- **Code Splitting**: `React.lazy`와 Vite 설정을 통해 번들 크기를 최적화하고 사용자 체감 로딩 속도를 개선한다.
|
||||
4. **안정성 및 관측성 (Observability)**
|
||||
- **Error Boundaries**: 런타임 오류 격리로 시스템 복원력을 확보한다.
|
||||
- **모니터링**: Sentry, LogRocket 및 브라우저 메모리 프로파일링을 통해 실시간 에러와 메모리 누수를 추적한다.
|
||||
|
||||
* **Virtual DOM 및 재조정 (Reconciliation)**
|
||||
실제 DOM의 직접적인 조작으로 인한 성능 저하를 막기 위해, React는 메모리에 가벼운 UI 표현인 Virtual DOM을 유지합니다 [1, 3]. 상태가 변경되면 새로운 Virtual DOM을 생성하고 이전 트리와 비교(Diffing)하여 변경된 부분만 실제 DOM에 업데이트합니다 [1, 3]. 이 재조정 알고리즘은 요소의 타입 비교 및 리스트의 `key` 속성을 활용해 $O(n^3)$의 복잡도를 $O(n)$으로 최적화합니다 [17-20].
|
||||
|
||||
* **[[React Fiber]] 아키텍처와 동시성 렌더링 ([[Concurrent Rendering]])**
|
||||
React 16에 도입된 Fiber 아키텍처는 렌더링 작업을 'Fiber 노드'라는 작은 작업 단위로 분할하여 동시성 렌더링을 가능하게 합니다 [21-23]. 우선순위 기반 모델([[Lane Model]])과 시간 분할([[Time-Slicing]])을 적용하여, 사용자의 입력(타이핑, 클릭 등)과 같은 긴급한 작업이 들어오면 무거운 렌더링 작업을 잠시 중단(Yield)하고 메인 스레드를 비워두어 UI의 반응성을 유지합니다 [22, 24-26].
|
||||
|
||||
* **컴포넌트 기반 아키텍처 ([[Component-Based Architecture]])**
|
||||
애플리케이션을 독립적이고 재사용 가능한 컴포넌트 단위로 분할하여 구축합니다 [27-29]. 각 컴포넌트는 자체 로직과 UI 상태를 캡슐화하여 렌더링하므로 유지보수성과 확장성이 높으며, 다른 프로젝트에서도 재사용하기 쉽습니다 [30-32].
|
||||
|
||||
* **렌더링 전략: [[CSR vs SSR vs SSG]] vs RSC**
|
||||
* **CSR (Client-Side Rendering):** 서버에서 빈 HTML을 받고 브라우저가 [[JavaScript]]를 다운로드하여 UI를 그립니다. 동적 상호작용에 유리하지만, JS 다운로드 전까지 화면이 보이지 않아 초기 로딩과 SEO에 불리합니다 [6, 33-35].
|
||||
* **SSR (Server-Side Rendering):** 서버에서 HTML을 미리 렌더링하여 전송하므로 초기 콘텐츠 표시가 빠르고 SEO에 유리합니다 [7, 36, 37]. 이후 브라우저에서 JS를 연결해 상호작용을 가능하게 하는 수화([[Hydration]]) 과정을 거칩니다 [7, 36, 38].
|
||||
* **SSG (Static Site Generation):** 빌드 타임에 HTML을 생성하여 CDN으로 배포하므로 로딩 속도가 가장 빠릅니다 [8, 39].
|
||||
* **[[React [[Server Components]] (RSC)]]:** 서버에서만 렌더링되며 클라이언트로 JavaScript 번들을 전혀 보내지 않습니다 [9, 40]. 번들 크기를 줄이고 서버 데이터베이스에 직접 접근할 수 있으며, 상호작용이 필요한 곳에만 Client Component를 혼합해 사용할 수 있습니다 [41-43].
|
||||
|
||||
* **최신 렌더링 최적화 기법 ([[React 18]] & 19)**
|
||||
* **자동 배칭 ([[Automatic Batching]]):** React 18부터는 이벤트 핸들러뿐만 아니라 Promise, setTimeout 등 비동기 작업 내의 여러 상태 업데이트를 하나로 묶어([[Batching]]) 단일 리렌더링만 유발합니다 [44-46].
|
||||
* **React Compiler:** [[React 19]]에 도입된 빌드 타임 최적화 도구로, 개발자가 수동으로 작성하던 `useMemo`, `useCallback`을 제거하고 AST를 분석해 자동으로 메모이제이션 경계를 삽입합니다 [5, 47-49]. 이를 통해 불필요한 연산과 리렌더링을 지능적으로 방지합니다 [49, 50].
|
||||
## ⚖️ Trade-offs & Caveats
|
||||
- **기술 스택 파편화**: 상태 관리나 렌더링 방식(SSR vs CSR)에 따라 너무 많은 도구를 도입할 경우, 프로젝트의 복잡도가 기하급수적으로 상승하고 유지보수 비용이 증가한다.
|
||||
- **성능 최적화의 함정**: `useMemo`나 `useCallback`의 남발은 오히려 비교 연산 오버헤드를 발생시킬 수 있으므로, 실제 병목 지점을 프로파일링한 후 적용해야 한다.
|
||||
- **규격화의 인지적 비용**: 엄격한 네이밍 규칙과 아키텍처는 신규 개발자의 온보딩을 어렵게 만들 수 있으므로, 자동화된 린트 규칙과 문서화가 필수적이다.
|
||||
|
||||
## 🔗 Knowledge Connections
|
||||
- **Related Topics:** [[Virtual DOM]], [[Critical Rendering Path (CRP)]], [[React Fiber]], [[Component-Based Architecture]], [[Client-Side Rendering (CSR)]], [[Server-Side Rendering (SSR)]], [[React Server Components (RSC)]]
|
||||
- **Projects/Contexts:** [[Next.js]], Single-Page Applications (SPA)
|
||||
- **Contradictions/Notes:** React Compiler의 도입으로 `React.memo`, `useMemo`, `useCallback`과 같은 수동 메모이제이션이 90% 이상 불필요해졌으나, 서드파티 라이브러리의 불안정한 객체 참조를 다루거나 특정 Effect 의존성을 명시적으로 제어해야 하는 경우에는 여전히 탈출구(Escape Hatch)로써 수동 메모이제이션의 사용이 필요할 수 있습니다 [51-53].
|
||||
### Related Concepts
|
||||
- **Feature-Sliced Design (FSD)**: 확장 가능한 구조 설계 방법론 (관계: 구조적 가이드라인)
|
||||
- **Zustand & TanStack Query**: 성능 중심의 상태 관리 전략 (관계: 데이터 레이어 도구)
|
||||
- **React Compiler**: 차세대 자동 최적화 메커니즘 (관계: 성능 최신화)
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-25*
|
||||
### Deeper Research Questions
|
||||
1. FSD 아키텍처에서 인증(Auth)과 같은 전역 관심사를 특정 레이어에 배치할 때 발생하는 의존성 딜레마를 어떻게 해결하는가?
|
||||
2. React Compiler 도입 시, 참조 안정성을 보장하지 않는 서드파티 라이브러리들과의 상호 운용성 한계는 무엇인가?
|
||||
3. Zustand의 외부 스토어 모델이 React의 Concurrent Rendering 모드와 충돌할 가능성과 그 해결책은?
|
||||
4. 모바일 및 저사양 기기에서 Hydration 비용을 최소화하기 위한 'Partial Hydration' 또는 'Islands Architecture'의 React적 구현 방안은?
|
||||
5. 프로덕션 환경에서 'Detached DOM nodes'로 인한 메모리 누수를 감지하기 위한 자동화된 회귀 테스트 구축이 가능한가?
|
||||
|
||||
### Practical Application Contexts
|
||||
- **대규모 웹 앱 구축**: 수천 개의 컴포넌트를 가진 복잡한 대시보드나 SaaS 플랫폼의 안정적 개발.
|
||||
- **성능 중심 리팩토링**: 로딩 속도가 느리고 리렌더링이 빈번한 기존 프로젝트를 최신 아키텍처와 도구로 현대화.
|
||||
|
||||
### Adjacent Topics
|
||||
- **Vite Build Optimization**
|
||||
- **Frontend Observability & Logging**
|
||||
- **Web Accessibility (A11y) & Core Web Vitals**
|
||||
Reference in New Issue
Block a user