# [[React Application Architecture]] ## πŸ“Œ Brief Summary React μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ•„ν‚€ν…μ²˜λŠ” ν™•μž₯μ„±, μœ μ§€λ³΄μˆ˜μ„±, κ³ μ„±λŠ₯을 보μž₯ν•˜κΈ° μœ„ν•΄ ν”„λ‘ νŠΈμ—”λ“œ μ‹œμŠ€ν…œμ˜ μ½”λ“œλ₯Ό μ²΄κ³„μ μœΌλ‘œ κ΅¬μ‘°ν™”ν•˜λŠ” ν”„λ ˆμž„μ›Œν¬μž…λ‹ˆλ‹€ [1]. 기술적인 파일 μœ ν˜• 기반의 폴더 κ΅¬μ‘°μ—μ„œ λ²—μ–΄λ‚˜ λΉ„μ¦ˆλ‹ˆμŠ€ κΈ°λŠ₯(Feature) 및 도메인 μ€‘μ‹¬μ˜ ꡬ쑰둜 μ „ν™˜ν•˜λŠ” 것이 졜근의 핡심 νŠΈλ Œλ“œμž…λ‹ˆλ‹€ [2, 3]. 효과적인 μ•„ν‚€ν…μ²˜λŠ” λΉ„μ¦ˆλ‹ˆμŠ€ 둜직과 UI의 λͺ…ν™•ν•œ 뢄리, μƒνƒœ μ†Œμœ κΆŒμ˜ μ •μ˜, 그리고 μ»΄ν¬λ„ŒνŠΈ κ°„μ˜ 암묡적인 결합도 κ°μ†Œλ₯Ό 톡해 λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œμ—μ„œλ„ μ•ˆμ „ν•˜κ³  지속 κ°€λŠ₯ν•œ μ„±μž₯을 κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€ [4, 5]. ## πŸ“– Core μ†ŒμŠ€ Content **1. 폴더 ꡬ쑰의 진화와 FSD (Feature-Sliced Design)** * **파일 μœ ν˜• 기반 ꡬ쑰 (File-Type Based Structure):** κ³Όκ±°μ—λŠ” `components/`, `hooks/`, `services/` λ“± 기술적 역할에 따라 νŒŒμΌμ„ λΆ„λ₯˜ν–ˆμœΌλ‚˜, μ΄λŠ” κΈ°λŠ₯이 λ³΅μž‘ν•΄μ§ˆμˆ˜λ‘ κ΄€λ ¨ 둜직이 흩어져 μœ μ§€λ³΄μˆ˜μ™€ ν™•μž₯에 λΆˆλ¦¬ν•©λ‹ˆλ‹€ [2, 6, 7]. * **κΈ°λŠ₯ 기반 ꡬ쑰 (Feature-Based Structure):** 인증(auth), λŒ€μ‹œλ³΄λ“œ(dashboard) λ“± λΉ„μ¦ˆλ‹ˆμŠ€ κΈ°λŠ₯μ΄λ‚˜ λͺ¨λ“ˆμ„ μ€‘μ‹¬μœΌλ‘œ 폴더λ₯Ό κ΅¬μ„±ν•˜μ—¬ 응집도λ₯Ό 높이고 λͺ¨λ“ˆ 독립성을 보μž₯ν•©λ‹ˆλ‹€ [3, 8]. * **FSD (Feature-Sliced Design):** ν”„λ‘ νŠΈμ—”λ“œμ— νŠΉν™”λœ ν˜„λŒ€μ  μ•„ν‚€ν…μ²˜ λ°©λ²•λ‘ μœΌλ‘œ, μ½”λ“œλ₯Ό `app`, `pages`, `widgets`, `features`, `entities`, `shared`의 μ—„κ²©ν•œ 계측 ꡬ쑰둜 λ‚˜λˆ•λ‹ˆλ‹€ [9-11]. ν•˜μœ„ 계측이 μƒμœ„ 계측에 μ˜μ‘΄ν•˜μ§€ λͺ»ν•˜κ²Œ ν•˜λŠ” '단방ν–₯ μ˜μ‘΄μ„±' 원칙을 κ°•μ œν•˜λ©°, 각 μŠ¬λΌμ΄μŠ€λŠ” `index.ts`λ₯Ό ν†΅ν•œ 단일 μ§„μž…μ (Public API)만 λ…ΈμΆœν•˜μ—¬ μΊ‘μŠν™”μ™€ μ•ˆμ „ν•œ λ¦¬νŒ©ν† λ§μ„ 보μž₯ν•©λ‹ˆλ‹€ [9, 12, 13]. **2. Clean Code 및 ν™•μž₯성을 μœ„ν•œ 섀계 원칙** * **관심사 뢄리 (Separation of Concerns):** UI λ Œλ”λ§μ„ λ‹΄λ‹Ήν•˜λŠ” μ»΄ν¬λ„ŒνŠΈμ™€ 데이터 페칭 및 μ™ΈλΆ€ 톡신을 λ‹΄λ‹Ήν•˜λŠ” μ„œλΉ„μŠ€ λ ˆμ΄μ–΄λ₯Ό λΆ„λ¦¬ν•˜μ—¬ 디버깅을 μš©μ΄ν•˜κ²Œ ν•΄μ•Ό ν•©λ‹ˆλ‹€ [14, 15]. * **SOLID 원칙:** 단일 μ±…μž„ 원칙(SRP)에 따라 ν•˜λ‚˜μ˜ μ»΄ν¬λ„ŒνŠΈλŠ” ν•˜λ‚˜μ˜ 일만 ν•΄μ•Ό ν•˜λ©°, 300쀄이 λ„˜μ–΄κ°€λŠ” μ»΄ν¬λ„ŒνŠΈλŠ” λ„ˆλ¬΄ λ§Žμ€ 역할을 ν•˜κ³  μžˆλ‹€λŠ” μ‹ ν˜Έμ΄λ―€λ‘œ 뢄리해야 ν•©λ‹ˆλ‹€ [16]. λ˜ν•œ 상속 λŒ€μ‹  μ»΄ν¬λ„ŒνŠΈ 합성을 μ‚¬μš©ν•˜κ³ (OCP), ν•„μš” μ—†λŠ” props μ˜μ‘΄μ„±μ„ 제거(ISP)ν•΄μ•Ό ν•©λ‹ˆλ‹€ [17, 18]. * **DRY, KISS, YAGNI:** 쀑볡 λ‘œμ§μ€ μ»€μŠ€ν…€ ν›…μ΄λ‚˜ κ³ μ°¨ μ»΄ν¬λ„ŒνŠΈλ‘œ λΆ„λ¦¬ν•˜λ˜(DRY), λ„ˆλ¬΄ λ³΅μž‘ν•œ μΆ”μƒν™”λŠ” ν”Όν•˜μ—¬ μ½”λ“œλ₯Ό μ§κ΄€μ μœΌλ‘œ μœ μ§€ν•΄μ•Ό ν•˜λ©°(KISS), ν˜„μž¬ ν•„μš”ν•˜μ§€ μ•Šμ€ 미래의 κΈ°λŠ₯은 미리 κ΅¬ν˜„ν•˜μ§€ μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€(YAGNI) [19-21]. **3. μƒνƒœ 관리 (State Management) μ•„ν‚€ν…μ²˜** * ν˜„λŒ€μ˜ μƒνƒœ κ΄€λ¦¬λŠ” 단일 μŠ€ν† μ–΄κ°€ μ•„λ‹Œ λͺ©μ μ— λ”°λ₯Έ μ„ΈλΆ„ν™”κ°€ ν‘œμ€€μž…λ‹ˆλ‹€ [22]. * **μ„œλ²„ μƒνƒœμ™€ ν΄λΌμ΄μ–ΈνŠΈ μƒνƒœ 뢄리:** APIμ—μ„œ κ°€μ Έμ˜€λŠ” μ„œλ²„ λ°μ΄ν„°λŠ” 캐싱과 동기화λ₯Ό μ§€μ›ν•˜λŠ” TanStack Query(React Query)둜 κ΄€λ¦¬ν•˜λ©°, λ„€νŠΈμ›Œν¬ λ‘œμ§μ„ UI와 λΆ„λ¦¬ν•©λ‹ˆλ‹€ [23, 24]. μ „μ—­ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μƒνƒœλŠ” Context API의 λΆˆν•„μš”ν•œ λ¦¬λ Œλ”λ§ 문제λ₯Ό ν”Όν•˜κΈ° μœ„ν•΄ Zustand와 같은 라이브러리λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 ꢌμž₯λ©λ‹ˆλ‹€ [22, 23, 25, 26]. **4. κ±°λ²„λ„ŒμŠ€: λͺ…λͺ… κ·œμΉ™, ν˜‘μ—… 및 λ¦¬νŒ©ν† λ§** * **λͺ…λͺ… κ·œμΉ™ (Naming Conventions):** 파일 및 폴더 이름은 OS ν˜Έν™˜μ„±μ„ μœ„ν•΄ `kebab-case`λ₯Ό, React μ»΄ν¬λ„ŒνŠΈλŠ” `PascalCase`λ₯Ό, ν•¨μˆ˜λ‚˜ μ»€μŠ€ν…€ ν›… 및 λ³€μˆ˜λŠ” `camelCase`λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 ν‘œμ€€μž…λ‹ˆλ‹€ [27-30]. * **μžλ™ν™”λœ κ±°λ²„λ„ŒμŠ€:** ESLintλ₯Ό 톡해 FSD 계측 κ°„ 잘λͺ»λœ μž„ν¬νŠΈλ₯Ό μ°¨λ‹¨ν•˜κ³ , Husky둜 컀밋 μ „ ν¬λ§·νŒ…κ³Ό λ¦°νŒ…μ„ κ°•μ œν•˜μ—¬ μ•„ν‚€ν…μ²˜ 원칙을 νŒ€ 전체에 μΌκ΄€λ˜κ²Œ μ μš©ν•©λ‹ˆλ‹€ [28]. * **μ›Œν¬ν”Œλ‘œμš° 및 λ¦¬νŒ©ν† λ§:** μ†Œκ·œλͺ¨ νŒ€μ΄λΌλ„ κΈ°λŠ₯ 브랜치 μ›Œν¬ν”Œλ‘œμš°λ₯Ό 톡해 메인 브랜치의 μ•ˆμ •μ„±μ„ μœ μ§€ν•˜λ©°, μ»€μŠ€ν…€ 훅을 λ¦¬νŒ©ν† λ§μ˜ κΈ°λ³Έ λ‹¨μœ„λ‘œ μ‚Όμ•„ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ UIλ‘œλΆ€ν„° μ•ˆμ „ν•˜κ²Œ κ²©λ¦¬ν•©λ‹ˆλ‹€ [31-34]. ## πŸ”— Knowledge Connections - **Related Topics:** [[Feature-Sliced Design]], [[State Management Architecture]], [[Clean Code Principles]], [[Folder Structure Best Practices]] - **Projects/Contexts:** [[Large-scale React Applications]], [[Frontend System Engineering]] - **Contradictions/Notes:** - 폴더 ꡬ쑰에 κ΄€ν•œ μ‹œκ° 차이: 평면 κ΅¬μ‘°λ‚˜ 파일 μœ ν˜•λ³„ ꡬ쑰(components, hooks λ“±)λŠ” μ΄ˆλ³΄μžλ‚˜ μ†Œκ·œλͺ¨ ν”„λ‘œμ νŠΈμ—λŠ” μ‹œμž‘ν•˜κΈ° μ‰¬μš΄ μž₯점이 μžˆμ§€λ§Œ, ν”„λ‘œμ νŠΈκ°€ 컀짐에 따라 ν™•μž₯성이 크게 λ–¨μ–΄μ§€λ―€λ‘œ κΆκ·Ήμ μœΌλ‘œλŠ” κΈ°λŠ₯ λ‹¨μœ„(Feature-based)λ‚˜ FSD μ•„ν‚€ν…μ²˜λ‘œ λ„˜μ–΄κ°€μ•Ό ν•œλ‹€κ³  κ°•μ‘°ν•©λ‹ˆλ‹€ [6-8, 35, 36]. - DRY와 KISS 원칙 κ°„μ˜ κ· ν˜•: μ†ŒμŠ€λŠ” 쀑볡을 μ€„μ΄λŠ” DRY 원칙을 κ°•μ‘°ν•˜λ©΄μ„œλ„, μ½”λ“œλ₯Ό κ³Όλ„ν•˜κ²Œ μΆ”μƒν™”ν•˜λ©΄ 직관성과 λ‹¨μˆœμ„±μ„ ν•΄μΉ˜λŠ” KISS 원칙 μœ„λ°˜μ„ μ΄ˆλž˜ν•  수 μžˆμœΌλ―€λ‘œ μ΅œμ†Œ 3번 이상 νŒ¨ν„΄μ΄ 반볡될 λ•Œλ§Œ 좔상화λ₯Ό μ μš©ν•˜λ„λ‘ ꢌμž₯ν•©λ‹ˆλ‹€ [19]. --- *Last updated: 2026-04-26*