feat: Knowledge Gardening Milestone 450 (Batch #23)
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
# [[Component-Based Architecture]]
|
||||
|
||||
## 📌 Brief Summary
|
||||
Component-Based Architecture(컴포넌트 기반 아키텍처)는 사용자 인터페이스(UI)를 재사용 가능한 독립적인 컴포넌트 단위로 분해하여 구성하는 아키텍처 패턴입니다 [1, 2]. 이 설계 방식은 일관성 있는 디자인 시스템을 구축하고, 코드 재사용을 장려하며, 개발자와 디자이너 간의 공통 어휘를 확립하는 데 탁월한 효과를 발휘합니다 [1]. 그러나 비즈니스 로직이나 상태(State)의 구성 방법에 대해서는 명확한 기준을 제시하지 않으므로, 대규모 애플리케이션에서는 구조화된 아키텍처를 추가로 도입하지 않으면 로직 계층이 무질서해질 수 있는 한계를 지닙니다 [1].
|
||||
|
||||
## 📖 Core Content
|
||||
* **UI 분해(UI Decomposition)와 디자인 시스템 지향:**
|
||||
리액트(React)는 본질적으로 컴포넌트 기반으로 작동하며, 컴포넌트 기반 아키텍처의 핵심 원칙은 UI를 세분화하여 구성하는 것입니다 [1, 2]. 이 구조는 최신 사용자 인터페이스와 디자인 시스템을 설계할 때 가장 적합한 모델로 평가받으며, 아토믹 디자인(Atomic Design)과 같은 방법론을 통해 시각적 일관성과 컴포넌트의 강력한 재사용성을 제공합니다 [1, 2].
|
||||
|
||||
* **대규모 확장성의 한계 (구조적 부족함):**
|
||||
컴포넌트 기반 아키텍처는 UI 요소를 깔끔하게 추상화하는 데 성공적이지만, 비즈니스 로직이나 상태 관리(State Management)를 어디에 어떻게 배치해야 하는지는 의도적으로 규정하지 않습니다 [1]. 이로 인해 적절한 제약 없이 개발을 진행하면 잘 정돈된 UI 컴포넌트 아래에 비즈니스 로직이 혼란스럽게 뒤섞이는 현상이 발생합니다 [1]. 따라서 애플리케이션의 규모가 커질 경우, 컴포넌트 기반 방식 단독으로는 불충분하며 기능 분할 설계(Feature-Sliced Design)나 도메인 주도 설계(DDD)와 같은 추가적인 아키텍처의 도입이 필요합니다 [1, 3, 4].
|
||||
|
||||
* **클린 코드와 설계 원칙의 적용:**
|
||||
유지보수 가능성을 높이기 위해 컴포넌트 설계 시 객체 지향 및 소프트웨어 엔지니어링 원칙을 적용할 수 있습니다. 예를 들어, 개방-폐쇄 원칙(OCP)을 리액트의 `children` prop이나 렌더 프롭(render props)을 통한 합성(Composition) 기능으로 구현하면, 기존 컴포넌트의 소스 코드를 수정하지 않고도 새로운 기능을 유연하게 확장할 수 있습니다 [5]. 또한, 컴포넌트가 너무 커지고 여러 책임(데이터 페칭, 상태 관리, 렌더링 등)을 지게 되면 단일 책임 원칙(SRP)에 따라 더 작고 집중된 컴포넌트로 분리하여 관리해야 합니다 [6].
|
||||
|
||||
## 🔗 Knowledge Connections
|
||||
- **Related Topics:** [[Atomic Design]], [[Feature-Sliced Design]], [[SOLID Principles]]
|
||||
- **Projects/Contexts:** [[React Application Architecture]], [[Design Systems]]
|
||||
- **Contradictions/Notes:** 소스에 따르면 컴포넌트 기반 아키텍처(또는 아토믹 디자인)는 훌륭한 UI 시스템 구축을 가능하게 하지만, 상태 소유권과 비즈니스 로직 구성에 대한 규칙이 없기 때문에 규모가 큰 리액트 애플리케이션의 아키텍처로는 불충분하다고 주장합니다 [1].
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-26*
|
||||
@@ -0,0 +1,18 @@
|
||||
# [[Domain-Driven Design]]
|
||||
|
||||
## 📌 Brief Summary
|
||||
도메인 주도 설계(Domain-Driven Design, DDD)는 기술적인 파일 유형이나 계층이 아닌 비즈니스 개념(예: 사용자, 주문, 결제 등)을 중심으로 프론트엔드 코드를 구성하는 아키텍처 접근법이다 [1]. 이 방식은 코드의 응집력을 높이고 비즈니스 이해관계자와의 원활한 소통을 돕지만, 프론트엔드 환경을 위한 구체적이고 표준화된 폴더 구조를 제공하지는 않는다는 한계가 있다 [1]. 이러한 개념은 최근 프론트엔드 생태계에서 기능 단위로 코드를 그룹화하는 기능 기반(Feature-based) 또는 도메인 기반(Domain-based) 디렉토리 구조 및 기능 분할 설계(Feature-Sliced Design)로 진화하여 확장성을 높이는 모범 사례로 활용되고 있다 [2-5].
|
||||
|
||||
## 📖 Core Content
|
||||
* **비즈니스 개념 중심의 아키텍처 구성:** 프론트엔드에서의 DDD는 단순한 사용자 인터페이스(UI) 개발을 넘어 비즈니스 도메인을 중심으로 코드를 그룹화한다 [1]. 이는 데이터를 다루거나 기술적 역할(컴포넌트, 훅, 서비스 등)별로 파일을 나누던 기존의 계층형 아키텍처(Layered Architecture)의 한계를 극복하며, 복잡한 비즈니스 로직을 처리하는 데 최적화되어 있다 [1, 6].
|
||||
* **프론트엔드 구현의 한계:** 순수한 도메인 주도 설계는 프론트엔드에 필요한 구체적이고 표준화된 폴더 구조를 제공하지 않는다 [1]. 이로 인해 개발 팀은 여러 도메인에서 공유하는 UI, 교차 도메인 기능 및 인프라 코드를 어디에 배치해야 할지 결정하는 데 종종 어려움을 겪는다 [1].
|
||||
* **기능 분할 설계(Feature-Sliced Design, FSD)로의 진화:** DDD의 한계를 극복하기 위해 프론트엔드 생태계에서는 기능 분할 설계(FSD)라는 구체적인 방법론이 등장했다 [2, 4]. FSD는 DDD와 개념적 유사성을 공유하면서도 React의 컴포넌트 기반 특성에 맞게 조정되었으며, 도메인 중심 원칙, 컴포넌트 기반 개발, 모듈형 시스템 아키텍처를 결합하여 명확한 경계와 계층 구조를 제공한다 [2, 4].
|
||||
* **모던 프론트엔드의 디렉토리 구조 모범 사례:** 2025년 기준, 프론트엔드 개발 산업 표준은 기능 기반 구조(Feature-based structure) 또는 도메인 기반 구조(Domain-based structure)로 이동했다 [3]. 컴포넌트 종류가 아닌 기능 및 도메인을 기준으로 컴포넌트, 훅, 로직을 분리하면 기능 간의 숨겨진 결합을 방지하고 코드베이스의 확장성과 유지보수성을 극대화할 수 있다 [3, 5].
|
||||
|
||||
## 🔗 Knowledge Connections
|
||||
- **Related Topics:** [[Feature-Sliced Design]], [[Component-Based Architecture]], [[Layered Architecture]]
|
||||
- **Projects/Contexts:** [[Scalable React Architecture]], [[Frontend Folder Structure]]
|
||||
- **Contradictions/Notes:** 소스 [1]는 DDD가 공유 UI나 공통 인프라 코드를 배치할 구체적이고 표준화된 프론트엔드 폴더 구조를 제공하지 못하는 한계가 있다고 지적합니다. 그러나 소스 [2, 4]에 따르면, 기능 분할 설계(FSD)가 DDD의 비즈니스 중심 원칙을 차용하면서도 프론트엔드에 특화된 구체적인 계층(Layers)과 슬라이스(Slices) 구조를 제공함으로써 이러한 단점을 보완하고 있음을 알 수 있습니다.
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-26*
|
||||
@@ -0,0 +1,36 @@
|
||||
# [[대규모 React 애플리케이션 및 엔터프라이즈 시스템 확장성 관리]]
|
||||
|
||||
## 📌 Brief Summary
|
||||
대규모 React 애플리케이션 및 엔터프라이즈 시스템 확장성 관리는 코드가 비대해짐에 따라 발생하는 유지보수성 및 성능 저하 문제를 방지하기 위해 엄격한 아키텍처와 엔지니어링 원칙을 적용하는 과정입니다. 기능 분할 설계(Feature-Sliced Design), 명확한 명명 규칙, 효율적인 상태 관리 전략, 그리고 최신 성능 최적화 기법을 도입하여 코드베이스를 모듈화합니다. 이를 통해 다수의 개발자가 협업하는 환경에서도 높은 응집도와 낮은 결합도를 유지하며 시스템을 안정적으로 성장시킬 수 있습니다.
|
||||
|
||||
## 📖 Core Content
|
||||
**1. 아키텍처 및 폴더 구조 (Architecture & Folder Structure)**
|
||||
* **기능 기반 구조(Feature-based Structure)로의 전환:** 단순한 기술적 역할(components, hooks 등) 기반의 폴더 구조는 애플리케이션이 커질수록 관련 파일들이 흩어져 확장에 불리합니다 [1, 2]. 2025년의 엔터프라이즈 권장 표준은 비즈니스 로직과 도메인을 중심으로 코드를 구성하는 기능 기반 구조입니다 [3-6].
|
||||
* **기능 분할 설계(Feature-Sliced Design, FSD):** FSD는 의존성 제어를 위해 구조를 `app`, `pages`, `widgets`, `features`, `entities`, `shared`의 엄격한 계층(Layer)으로 나눕니다 [7, 8]. 상위 계층은 하위 계층에만 의존해야 하는 단방향 의존성 규칙을 강제하여 순환 참조를 방지합니다 [7, 9]. 또한, 각 슬라이스(Slice)는 `index.ts`를 단일 진입점(Public API)으로 노출해 내부 구현을 캡슐화해야 합니다 [10-12].
|
||||
|
||||
**2. 대규모 상태 관리 전략 (State Management Strategy)**
|
||||
* **상태의 파편화 및 전문화:** 단일 저장소 대신 데이터 특성에 따라 도구를 분리합니다 [13]. API에서 가져오는 '서버 상태'는 TanStack Query를 사용해 캐싱과 동기화를 처리하고, '클라이언트 애플리케이션 상태'는 Zustand나 Jotai 등을 사용하여 관리합니다 [14, 15].
|
||||
* **Context API vs Zustand vs Redux:** Context API는 테마나 다국어처럼 드물게 변경되는 정적 상태에 적합하지만, 상태가 자주 변경되면 이를 구독하는 모든 컴포넌트의 불필요한 리렌더링을 유발합니다 [16-18]. 잦은 상태 변경에는 상태 슬라이스 단위로 구독할 수 있는 Zustand가 적합하며 [18], 복잡한 파생 상태를 관리해야 하거나 규모가 매우 큰 팀(10명 이상)의 경우 구조적 일관성을 강제하는 Redux(RTK) 도입이 필수적입니다 [19-21].
|
||||
|
||||
**3. 성능 및 빌드 최적화 (Performance & Build Optimization)**
|
||||
* **번들 크기 축소 및 지연 로딩:** 초기 로딩 성능 최적화를 위해 Vite의 `manualChunks`를 활용하여 React 코어 로직과 서드파티 벤더 라이브러리를 별도의 파일로 분리해 브라우저 캐싱 효율을 높입니다 [22-24]. 또한 `React.lazy()`와 `<Suspense>`를 활용해 라우트나 무거운 UI 위젯 수준에서 코드 스플리팅(Code Splitting)을 적용합니다 [24-26].
|
||||
* **렌더링 성능 및 React Compiler:** 불필요한 렌더링을 막기 위해 `React.memo`, `useMemo`, `useCallback`을 활용하되 프로파일링(측정)을 동반하여 남용을 피해야 합니다 [27-29]. React Compiler를 도입하면 빌드 타임에 코드 최적화 및 렌더링 결과의 메모이제이션이 자동으로 적용되어 개발자가 수동 최적화 코드에 쏟는 수고를 덜고 깔끔한 코드를 유지할 수 있습니다 [22, 30-33].
|
||||
|
||||
**4. 클린 코드 원칙 및 명명 규칙 (Clean Code & Naming Conventions)**
|
||||
* **소프트웨어 공학 원칙 적용:** React 개발에 SOLID 원칙을 적용하여 응집도를 높여야 합니다. 특히 단일 책임 원칙(SRP)을 통해 너무 많은 역할을 하는 거대한 컴포넌트를 분리해야 합니다 [34, 35]. 더불어 코드 중복을 피하는 DRY, 과도한 추상화를 경계하는 KISS, 불필요한 기능을 미리 구현하지 않는 YAGNI 원칙을 통해 유지보수성을 극대화합니다 [36-40].
|
||||
* **일관된 명명 규칙:** 운영체제 간(Windows, macOS, Linux) 대소문자 구분 방식 차이로 인한 빌드 충돌을 막기 위해 파일명과 폴더명은 `kebab-case`를 사용합니다 [41-43]. 반면 React 컴포넌트 이름은 `PascalCase`를 적용하고, 변수, 함수, Custom Hook에는 `camelCase`를 적용합니다 [43-46].
|
||||
|
||||
**5. 안정성 보장 및 로깅 디버깅 체계 (Resilience & Debugging)**
|
||||
* **오류 격리:** React Error Boundary 컴포넌트를 전략적으로 배치하여 서드파티 위젯이나 불안정한 UI 섹션에서 발생하는 런타임 에러가 전체 앱을 중단(백화현상)시키는 것을 차단합니다 [47-51].
|
||||
* **메모리 누수(Memory Leaks) 해결:** 애플리케이션의 성능 저하를 방지하기 위해 Chrome DevTools의 Memory 패널(Heap Snapshots, Allocation Timelines)을 사용하여 DOM 트리에서 분리된(detached) 노드나 클로저로 인해 비정상적으로 유지되는 JavaScript 참조를 식별하고 정리해야 합니다 [52-58].
|
||||
* **클라우드 로깅:** 프로덕션 환경에서는 Sentry, LogRocket, Datadog 같은 관측성 도구를 활용하여, 에러의 그룹화 식별과 세션 리플레이(Session Replay) 기능을 통해 문제의 맥락을 추적합니다 [59, 60].
|
||||
|
||||
## 🔗 Knowledge Connections
|
||||
- **Related Topics:** `[[Feature-Sliced Design]]`, `[[상태 관리 아키텍처(State Management Architecture)]]`, `[[코드 스플리팅 및 성능 최적화(Code Splitting & Performance Optimization)]]`, `[[클린 코드 및 SOLID 원칙(Clean Code & SOLID Principles)]]`, `[[React Error Boundaries]]`
|
||||
- **Projects/Contexts:** `[[프론트엔드 관측성(Frontend Observability) 및 로깅 시스템]]`, `[[Vite 빌드 번들 최적화]]`, `[[Git Branching Strategy 및 협업 워크플로우]]`
|
||||
- **Contradictions/Notes:**
|
||||
- 기능 분할 설계(Feature-Sliced Design)는 장기적인 구조 확장성에는 뛰어나지만, 프로젝트의 규모가 작거나 단순할 때는 오버헤드가 크고 러닝 커브가 가파르다는 한계가 존재합니다 [5, 61, 62].
|
||||
- React Compiler는 개발자에게 렌더링 최적화를 자동화하여 편리함을 제공하지만, 일부 타사 라이브러리가 렌더링마다 불안정한 참조를 반환하는 경우 최적화 사슬이 끊어질 수 있으며 내부 메커니즘을 파악하기 힘든 '블랙박스' 역할을 해 성능 디버깅을 어렵게 만들 수 있습니다 [63-65].
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-26*
|
||||
Reference in New Issue
Block a user