# [[Folder Structure Best Practices]] ## πŸ“Œ Brief Summary React λ“± ν”„λ‘ νŠΈμ—”λ“œ ν”„λ‘œμ νŠΈμ—μ„œ μ½”λ“œμ˜ μœ μ§€λ³΄μˆ˜μ„±, ν™•μž₯μ„±, 그리고 ν˜‘μ—… νš¨μœ¨μ„±μ„ 높이기 μœ„ν•΄ 파일과 디렉터리λ₯Ό μ²΄κ³„μ μœΌλ‘œ κ΅¬μ„±ν•˜λŠ” λ°©λ²•λ‘ μž…λ‹ˆλ‹€ [1]. ν˜„λŒ€μ μΈ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” 과거의 파일 μœ ν˜• 기반(μœ ν˜•λ³„ λΆ„λ₯˜) κ΅¬μ‘°μ—μ„œ λ²—μ–΄λ‚˜, κΈ°λŠ₯(Feature)μ΄λ‚˜ 도메인 μ€‘μ‹¬μœΌλ‘œ κ΄€λ ¨λœ λ‘œμ§μ„ λ¬ΆλŠ” ν•˜μ΄λΈŒλ¦¬λ“œ λ˜λŠ” κΈ°λŠ₯ 기반 방식이 λͺ¨λ²” μ‚¬λ‘€λ‘œ ꢌμž₯λ©λ‹ˆλ‹€ [2, 3]. 이λ₯Ό 톡해 UI, λΉ„μ¦ˆλ‹ˆμŠ€ 둜직, μƒνƒœ 관리 λ“±μ˜ 관심사λ₯Ό λͺ…ν™•νžˆ λΆ„λ¦¬ν•˜κ³  ν”„λ‘œμ νŠΈκ°€ 컀짐에 따라 λ°œμƒν•˜λŠ” 기술 뢀채λ₯Ό μ΅œμ†Œν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [4]. ## πŸ“– Core μ†ŒμŠ€ Content * **ꡬ쑰의 진화와 ν•œκ³„:** * 초기 μ†Œκ·œλͺ¨ ν”„λ‘œμ νŠΈλŠ” 주둜 λͺ¨λ“  μ»΄ν¬λ„ŒνŠΈλ₯Ό `components` 폴더에, λͺ¨λ“  훅을 `hooks` 폴더에 λ„£λŠ” ν”Œλž«(Flat) κ΅¬μ‘°λ‚˜ 파일 μœ ν˜• 기반 ꡬ쑰둜 μ‹œμž‘ν•©λ‹ˆλ‹€ [5, 6]. * ν•˜μ§€λ§Œ μ•±μ˜ 규λͺ¨κ°€ 컀지면 단일 κΈ°λŠ₯을 μˆ˜μ •ν•˜κΈ° μœ„ν•΄ μ—¬λŸ¬ 폴더λ₯Ό λ„˜λ‚˜λ“€μ–΄μ•Ό ν•˜λ―€λ‘œ, 개발 속도가 λŠλ €μ§€κ³  디버깅이 μ–΄λ €μ›Œμ§€λ©° μ½”λ“œλ² μ΄μŠ€κ°€ λ³΅μž‘ν•΄μ§€λŠ” ν•œκ³„κ°€ λ°œμƒν•©λ‹ˆλ‹€ [3, 6, 7]. * **κΈ°λŠ₯ 기반(Feature-based) 및 ν•˜μ΄λΈŒλ¦¬λ“œ ꡬ쑰:** * 2025λ…„ κΈ°μ€€ κ°€μž₯ ꢌμž₯λ˜λŠ” μ ‘κ·Ό 방식은 파일 μœ ν˜•μ΄ μ•„λ‹Œ λΉ„μ¦ˆλ‹ˆμŠ€ κΈ°λŠ₯μ΄λ‚˜ λͺ¨λ“ˆμ„ μ€‘μ‹¬μœΌλ‘œ 폴더λ₯Ό κ΅¬μ„±ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€ [2, 8, 9]. * 각 κΈ°λŠ₯(Feature)은 μΊ‘μŠν™”λ˜μ–΄ λ‹€λ₯Έ κΈ°λŠ₯κ³Ό λ…λ¦½μ μœΌλ‘œ μž‘λ™ν•  수 μžˆμœΌλ―€λ‘œ, 규λͺ¨ ν™•μž₯ μ‹œ κΈ°μ‘΄ μ½”λ“œμ— 영ν–₯을 μ£Όμ§€ μ•Šκ³  μƒˆλ‘œμš΄ κΈ°λŠ₯을 λ§€λ„λŸ½κ²Œ μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [8, 10]. * **ꢌμž₯ 디렉터리 ꡬ성 (src/ ν•˜μœ„):** * `assets/`: 이미지, 폰트 λ“± 정적 λ―Έλ””μ–΄ λ¦¬μ†ŒμŠ€ 보관 [11, 12]. * `components/`: μ—¬λŸ¬ κΈ°λŠ₯μ—μ„œ κ³΅ν†΅μœΌλ‘œ μž¬μ‚¬μš©λ˜λŠ” 도메인에 ꡬ애받지 μ•ŠλŠ” UI μš”μ†Œ (예: λ²„νŠΌ, λͺ¨λ‹¬, λ„€λΉ„κ²Œμ΄μ…˜ λ°” λ“±) [2, 12, 13]. * `features/` (λ˜λŠ” `modules/`): 인증(Auth), λŒ€μ‹œλ³΄λ“œ(Dashboard) λ“± 도메인별 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직. 이 폴더 λ‚΄λΆ€μ—λŠ” ν•΄λ‹Ή κΈ°λŠ₯μ—λ§Œ μ“°μ΄λŠ” μ»΄ν¬λ„ŒνŠΈ, ν›…, API 등을 μΊ‘μŠν™”ν•˜μ—¬ λ³΄κ΄€ν•©λ‹ˆλ‹€ [2, 9, 13]. * `hooks/`: 폼 처리, 데이터 페칭 λ“± μ•± μ „λ°˜μ—μ„œ μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ»€μŠ€ν…€ ν›… [9, 14]. * `pages/` (λ˜λŠ” `routes/`): λΌμš°νŒ…μ— λ§€ν•‘λ˜λŠ” νŽ˜μ΄μ§€ 레벨 μ»΄ν¬λ„ŒνŠΈ [15, 16]. * `services/`: μ„œλ“œνŒŒν‹° μ„œλΉ„μŠ€ μ—°λ™μ΄λ‚˜ API μš”μ²­ λ“± μ™ΈλΆ€ 톡신 둜직 [16, 17]. * `store/` (λ˜λŠ” `context/`): Redux, Zustand, Context APIλ₯Ό ν™œμš©ν•˜λŠ” μ „μ—­ μƒνƒœ 관리 둜직 [14-16]. * `utils/`: λ‚ μ§œ ν¬λ§·νŒ…, 데이터 μœ νš¨μ„± 검사 λ“± μƒνƒœλ₯Ό κ°€μ§€μ§€ μ•ŠλŠ” μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜ [17, 18]. * `styles/`: κΈ€λ‘œλ²Œ CSS, ν…Œλ§ˆ(Theme) λ“± μ „μ—­ μŠ€νƒ€μΌλ§ 파일 [18, 19]. * `types/`: TypeScript μ‚¬μš© μ‹œ μ „μ—­μœΌλ‘œ μ‚¬μš©λ˜λŠ” νƒ€μž… 및 μΈν„°νŽ˜μ΄μŠ€ 보관 [18]. * `config/`: ν™˜κ²½ λ³€μˆ˜λ‚˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „μ—­ μ„€μ •(API κΈ°λ³Έ URL λ“±) 관리 [18, 20]. * **Feature-Sliced Design (FSD):** * κΈ°λŠ₯ 기반 폴더 ꡬ쑰보닀 더 μ—„κ²©ν•˜κ²Œ μ˜μ‘΄μ„±μ˜ λ°©ν–₯을 ν†΅μ œν•˜λŠ” ν”„λ‘ νŠΈμ—”λ“œ μ•„ν‚€ν…μ²˜ λ°©λ²•λ‘ μž…λ‹ˆλ‹€ [21]. * `shared` -> `entities` -> `features` -> `widgets` -> `pages` -> `app` μ΄λΌλŠ” κ³ μ •λœ λ‹€μΈ΅ 계측(Layer)을 κ°€μ§‘λ‹ˆλ‹€ [22, 23]. * μƒμœ„ 계측은 ν•˜μœ„ κ³„μΈ΅μ˜ μ½”λ“œλ₯Ό κ°€μ Έμ˜¬ 수 μžˆμ§€λ§Œ(Import), ν•˜μœ„ 계측은 μƒμœ„ 계측을 μ°Έμ‘°ν•  수 μ—†λŠ” 단방ν–₯ μ˜μ‘΄μ„± κ·œμΉ™μ„ 톡해 μˆœν™˜ μ˜μ‘΄μ„±μ„ λ°©μ§€ν•©λ‹ˆλ‹€ [22, 24]. * **Next.js ν™˜κ²½μ—μ„œμ˜ 라우트 κ·Έλ£Ή (Route Groups):** * Next.js ν”„λ‘œμ νŠΈμ—μ„œλŠ” κ΄„ν˜Έλ₯Ό μ‚¬μš©ν•œ 폴더λͺ… `(folderName)` 방식을 톡해, μ‹€μ œ URL κ²½λ‘œμ—λŠ” 영ν–₯을 μ£Όμ§€ μ•ŠμœΌλ©΄μ„œλ„ κ΄€λ ¨ κΈ°λŠ₯μ΄λ‚˜ 논리에 따라 라우트λ₯Ό κΉ”λ”ν•˜κ²Œ κ·Έλ£Ήν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [25-27]. ## πŸ”— Knowledge Connections ### Related Concepts - [[Feature-Sliced Design]] - μ—°κ²° 이유: λŒ€κ·œλͺ¨ React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 폴더 ꡬ쑰λ₯Ό κ΅¬μΆ•ν•˜κΈ° μœ„ν•΄ κ³ μ•ˆλœ 전문적인 ν”„λ‘ νŠΈμ—”λ“œ μ•„ν‚€ν…μ²˜ 방법둠이기 λ•Œλ¬Έμž…λ‹ˆλ‹€ [21]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: 폴더 κ°„μ˜ 단방ν–₯ μ˜μ‘΄μ„± κ·œμΉ™κ³Ό 각 폴더(Layer, Slice, Segment)κ°€ λ‹΄λ‹Ήν•΄μ•Ό ν•˜λŠ” μ—­ν• μ˜ μ—„κ²©ν•œ 뢄리 방식 [22, 28]. - [[Separation of Concerns]] (κ΄€μ‹¬μ‚¬μ˜ 뢄리) - μ—°κ²° 이유: 폴더 ꡬ쑰λ₯Ό μ„€κ³„ν•˜λŠ” 근본적인 λͺ©μ μ΄ UI λ Œλ”λ§, μ „μ—­ μƒνƒœ 관리, 데이터 톡신(API) λ“±μ˜ μ±…μž„μ„ 각기 λ‹€λ₯Έ μœ„μΉ˜λ‘œ λΆ„λ¦¬ν•˜λŠ” 데 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€ [4, 29]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: `services/`, `store/`, `components/` λ“±μ˜ 폴더λ₯Ό λΆ„λ¦¬ν•˜μ—¬ 단일 μ±…μž„ 원칙(SRP)을 ν”„λ‘ νŠΈμ—”λ“œ μ•„ν‚€ν…μ²˜ μ „λ°˜μ— μ μš©ν•˜λŠ” 방법 [4, 30]. - [[Naming Conventions]] (λͺ…λͺ… κ·œμΉ™) - μ—°κ²° 이유: μΌκ΄€λœ 폴더 및 파일 λͺ…λͺ… κ·œμΉ™(예: 폴더λͺ…은 kebab-case, μ»΄ν¬λ„ŒνŠΈλŠ” PascalCase)은 폴더 ꡬ쑰 λ‚΄μ—μ„œ νŒŒμΌμ„ 예츑 κ°€λŠ₯ν•˜κ²Œ μ°Ύκ³  μΆ©λŒμ„ λ°©μ§€ν•˜λŠ” 핡심 κ·œμΉ™μ΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€ [31-33]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: λ‹€μ–‘ν•œ μš΄μ˜μ²΄μ œμ™€ CI/CD νŒŒμ΄ν”„λΌμΈμ—μ„œ λΉŒλ“œ μ—λŸ¬λ₯Ό λ°©μ§€ν•˜κ³  νŒ€ λ‚΄ μ½”λ“œ 가독성을 μœ μ§€ν•˜λŠ” 방법 [34, 35]. ### Deeper Research Questions - κΈ°λŠ₯ 기반(Feature-based) 폴더 κ΅¬μ‘°μ—μ„œ 각 κΈ°λŠ₯이 μƒν˜Έμž‘μš©ν•΄μ•Ό ν•  λ•Œ λ°œμƒν•˜λŠ” ꡐ차 관심사(Cross-cutting concerns)λ‚˜ 곡유 μ˜μ‘΄μ„±μ„ μ–΄λ–»κ²Œ κ΄€λ¦¬ν•˜κ³  ν•΄κ²°ν•  수 μžˆλŠ”κ°€? - λ ˆκ±°μ‹œ 파일 μœ ν˜• 기반(File-type based) React ν”„λ‘œμ νŠΈλ₯Ό κΈ°λŠ₯ 기반 ν˜Ήμ€ Feature-Sliced Design으둜 μ μ§„μ μœΌλ‘œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•˜κΈ° μœ„ν•œ κ°€μž₯ μ•ˆμ „ν•˜κ³  효율적인 λ‹¨κ³„λŠ” 무엇인가? - Feature-Sliced Design의 단방ν–₯ μ˜μ‘΄μ„± 원칙을 ESLint와 같은 정적 뢄석 λ„κ΅¬λ‘œ μžλ™ κ°•μ œν™”(Governance)ν•˜λŠ” 방법은 무엇인가? - 폴더 ꡬ쑰λ₯Ό λͺ¨λ“ˆν™”ν•  λ•Œ λ°œμƒν•˜λŠ” 파일 쀑첩 λ¬Έμ œμ™€ 이λ₯Ό ν”Όν•˜κΈ° μœ„ν•œ μ μ ˆν•œ 인덱슀(Barrel) 파일 μ‚¬μš© μ „λž΅μ˜ μž₯단점은 무엇인가? - μƒνƒœ 관리 라이브러리(Context API, Zustand, Redux λ“±)의 μ’…λ₯˜μ— 따라 ꢌμž₯λ˜λŠ” `store/` 폴더 λ‚΄λΆ€μ˜ κ΅¬μ‘°λŠ” μ–΄λ–»κ²Œ 달라져야 ν•˜λŠ”κ°€? ### Practical Application Contexts - **Implementation:** React μ»΄ν¬λ„ŒνŠΈλ₯Ό 생성할 λ•Œ, λͺ¨λ“  μš”μ†Œλ₯Ό `components/` 폴더에 λ„£μ§€ μ•Šκ³  νŠΉμ • 도메인(예: 인증)μ—λ§Œ μ“°μ΄λŠ” μš”μ†ŒλŠ” `features/auth/components/`둜 κ²©λ¦¬ν•˜μ—¬ μΊ‘μŠν™”λ₯Ό μ‹€μ²œν•©λ‹ˆλ‹€. - **System Design:** ν”„λ‘œμ νŠΈ 초기 μ„ΈνŒ… λ‹¨κ³„μ—μ„œ λΉ„μ¦ˆλ‹ˆμŠ€ 도메인을 λΆ„μ„ν•˜μ—¬ μ–΄λ–€ μ½”λ“œκ°€ μ „μ—­(`shared/` λ˜λŠ” `components/`)에 μ†ν•˜κ³  μ–΄λ–€ μ½”λ“œκ°€ 둜컬(`features/`)에 속할지 기쀀을 λ§ˆλ ¨ν•©λ‹ˆλ‹€. - **Operation / Maintenance:** κΈ°λŠ₯에 버그가 λ°œμƒν–ˆμ„ λ•Œ, ν•΄λ‹Ή κΈ°λŠ₯의 폴더(`features/feature-name/`)만 ν™•μΈν•˜λ©΄ UI, μƒνƒœ, API μš”μ²­ 둜직이 λͺ¨μ—¬ μžˆμ–΄ 디버깅 및 μœ μ§€λ³΄μˆ˜ 속도가 크게 ν–₯μƒλ©λ‹ˆλ‹€. - **Learning Path:** μ²˜μŒμ—λŠ” λ‹¨μˆœν•œ ν”Œλž« ꡬ쑰둜 Reactλ₯Ό ν•™μŠ΅ν•œ ν›„, μ»΄ν¬λ„ŒνŠΈκ°€ 30개 μ΄μƒμœΌλ‘œ λŠ˜μ–΄λ‚˜λŠ” μ‹œμ μ— κΈ°λŠ₯ 기반 폴더 ꡬ쑰λ₯Ό λ„μž…ν•˜μ—¬ μ•„ν‚€ν…μ²˜ 섀계 μ—­λŸ‰μ„ κΈ°λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€. - **My Project Relevance:** ν˜„μž¬ μ§„ν–‰ μ€‘μ΄κ±°λ‚˜ λ¦¬νŒ©ν† λ§ν•΄μ•Ό ν•  React μ½”λ“œλ² μ΄μŠ€μ—μ„œ, κ±°λŒ€ν•΄μ§„ `components/` 폴더λ₯Ό 도메인 λ‹¨μœ„μ˜ `features/` ν΄λ”λ‘œ λ‚˜λˆ„κ³  μž¬μ‚¬μš© λΆˆκ°€ λ‘œμ§λ“€μ„ λΆ„λ¦¬ν•˜λŠ” 데 μ§μ ‘μ μœΌλ‘œ μ μš©λ©λ‹ˆλ‹€. ### Adjacent Topics - [[State Management]] - ν™•μž₯ λ°©ν–₯: μ „μ—­ μƒνƒœ(Global State)와 둜컬 μƒνƒœ(Local State)λ₯Ό 어디에 보관해야 ν•˜λŠ”μ§€, Zustand와 같은 도ꡬ가 `store/` ν΄λ”μ˜ ꡬ쑰λ₯Ό μ–΄λ–»κ²Œ λ‹¨μˆœν™”ν•˜λŠ”μ§€ ν™•μž₯ν•˜μ—¬ 쑰사할 수 μžˆμŠ΅λ‹ˆλ‹€. - [[Code Splitting]] (μ½”λ“œ μŠ€ν”Œλ¦¬νŒ…) - ν™•μž₯ λ°©ν–₯: 라우트 ν˜Ήμ€ 폴더(Feature) λ‹¨μœ„λ‘œ μ½”λ“œ μŠ€ν”Œλ¦¬νŒ…κ³Ό μ§€μ—° λ‘œλ”©(Lazy Loading)을 μ μš©ν•˜μ—¬ 초기 λ²ˆλ“€ 크기λ₯Ό 쀄이고 μ„±λŠ₯을 μ΅œμ ν™”ν•˜λŠ” μ „λž΅κ³Ό μ—°κ²°λ©λ‹ˆλ‹€. --- *Last updated: 2026-04-30*