# [[Next.js Modular and Scalable Project Structure|Next.js Modular and Scalable Project Structure]] ## πŸ“ŒBrief 단기 μš”μ•½ [[Next.js|Next.js]]의 λͺ¨λ“ˆν™”λ˜κ³  ν™•μž₯ κ°€λŠ₯ν•œ ν”„λ‘œμ νŠΈ κ΅¬μ‘°λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 컀짐에 따라 μ½”λ“œλ₯Ό 파일 μœ ν˜•μ΄ μ•„λ‹Œ κΈ°λŠ₯(Feature)μ΄λ‚˜ 도메인(Domain)을 μ€‘μ‹¬μœΌλ‘œ κ΅¬μ„±ν•˜μ—¬ μœ μ§€λ³΄μˆ˜μ„±μ„ κ·ΉλŒ€ν™”ν•˜λŠ” μ•„ν‚€ν…μ²˜ νŒ¨ν„΄μž…λ‹ˆλ‹€ [1, 2]. `app/` λ””λ ‰ν† λ¦¬λŠ” 였직 λΌμš°νŒ…κ³Ό λ ˆμ΄μ•„μ›ƒ κ΄€λ¦¬μ—λ§Œ μ‚¬μš©ν•˜κ³ , 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직과 UI μ»΄ν¬λ„ŒνŠΈλŠ” `src/features/` 등에 λΆ„λ¦¬ν•˜μ—¬ μΊ‘μŠν™”ν•©λ‹ˆλ‹€ [1, 3]. 이 κ΅¬μ‘°λŠ” λŒ€κ·œλͺ¨ ν”„λ‘œμ νŠΈμ—μ„œ UI, λΉ„μ¦ˆλ‹ˆμŠ€ 둜직, CSS 관리λ₯Ό μ²΄κ³„ν™”ν•˜μ—¬ 기술 뢀채λ₯Ό 쀄이고 νŒ€ κ°„ ν˜‘μ—… νš¨μœ¨μ„ λ†’μ΄λŠ” 데 ν•„μˆ˜μ μž…λ‹ˆλ‹€ [2, 4]. ## πŸ“– Core Content - **κΈ°λŠ₯/도메인 주도 μ•„ν‚€ν…μ²˜ ([[Feature-Driven Architecture|Feature-Driven Architecture]]):** μ»΄ν¬λ„ŒνŠΈ, ν›…(hooks), μœ ν‹Έλ¦¬ν‹°λ₯Ό 파일 μœ ν˜•λ³„λ‘œ λ¬ΆλŠ” λŒ€μ‹ , μ‹€μ œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 도메인(예: `market-data`, `user-profile` λ“±)을 기반으둜 `features/` 디렉토리에 κ·Έλ£Ήν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€ [1-3]. 이 방식을 μ±„νƒν•˜λ©΄ μ „μ—­ μ»΄ν¬λ„ŒνŠΈ 폴더가 λΉ„λŒ€ν•΄μ§€λŠ” 것을 λ°©μ§€ν•  수 있으며, νŠΉμ • κΈ°λŠ₯에 버그가 λ°œμƒν–ˆμ„ λ•Œ μ •ν™•νžˆ μ–΄λŠ 폴더λ₯Ό 확인해야 ν•˜λŠ”μ§€ μ•Œ 수 μžˆμ–΄ μΊ‘μŠν™”μ™€ μœ μ§€λ³΄μˆ˜μ„±μ΄ 크게 ν–₯μƒλ©λ‹ˆλ‹€ [3, 4]. - **μ•± λΌμš°ν„°μ™€ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직의 λͺ…ν™•ν•œ 뢄리:** Next.js의 `app/` 폴더 λ‚΄ νŒŒμΌλ“€(예: `page.tsx`, `layout.tsx`)은 λΌμš°νŒ…, 메타데이터 생성, 검색 λ§€κ°œλ³€μˆ˜([[Search|Search]] params) 처리 λ“± Next.js 고유의 κΈ°λŠ₯만 λ‹΄λ‹Ήν•˜λ„λ‘ λ‹¨μˆœν•˜κ²Œ μœ μ§€ν•΄μ•Ό ν•©λ‹ˆλ‹€ [1, 3]. μ‹€μ œ 데이터 패칭(fetching)κ³Ό ν”„λ ˆμ  ν…Œμ΄μ…˜ 계측 λ“± λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ€ λΌμš°νŠΈμ™€ μ„žμ΄μ§€ μ•Šλ„λ‘ μ™ΈλΆ€ ν΄λ”λ‘œ λΆ„λ¦¬ν•©λ‹ˆλ‹€ [3, 5]. - **μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ»΄ν¬λ„ŒνŠΈ 및 CSS μ‹œμŠ€ν…œ 톡합:** λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œμ—μ„œλŠ” Storybookκ³Ό 같은 νˆ΄μ„ μ‚¬μš©ν•΄ λ¬Έμ„œν™”λœ μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ»΄ν¬λ„ŒνŠΈ μ‹œμŠ€ν…œμ„ κ΅¬μΆ•ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€ [5]. 특히 [[Next.js App Router|Next.js App Router]]λ₯Ό μ‚¬μš©ν•  경우, 기쑴의 λŸ°νƒ€μž„ CSS-in-JS(예: styled-components, Emotion)λŠ” [[React Server Components|React Server Components]](RSC)와 본질적으둜 ν˜Έν™˜λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ [6]. λ”°λΌμ„œ λͺ¨λ“ˆν™”λœ ν”„λ‘œμ νŠΈ κ΅¬μ‘°μ—μ„œλŠ” μ„±λŠ₯κ³Ό ν˜Έν™˜μ„±μ„ μœ„ν•΄ Tailwind CSS, [[CSS Modules|CSS Modules]] λ˜λŠ” λΉŒλ“œ νƒ€μž„μ— 정적 CSSλ₯Ό μƒμ„±ν•˜λŠ” [[vanilla-extract|vanilla-extract]] 방식을 μ±„νƒν•˜λŠ” 것이 ꢌμž₯λ©λ‹ˆλ‹€ [7, 8]. - **ν™•μž₯성을 μœ„ν•œ μ„€μ • 및 κ·œμΉ™ ([[Scalability|Scalability]] Practices):** - **μ ˆλŒ€ 경둜(Absolute Imports) μ‚¬μš©:** `../../../components/Button`κ³Ό 같은 λ³΅μž‘ν•œ 경둜 λŒ€μ‹  `tsconfig.json`의 경둜 별칭(path aliases)을 ν™œμš©ν•˜μ—¬ `@/components/ui/Button`처럼 κΉ”λ”ν•˜κ²Œ μ½”λ“œλ₯Ό μœ μ§€ν•©λ‹ˆλ‹€ [4, 9, 10]. - **API 및 μƒνƒœ 관리 쀑앙화:** λ„€νŠΈμ›Œν¬ 둜직(API 호좜)은 κΈ°λŠ₯(feature)별 μ„œλΉ„μŠ€ 폴더에 쀑앙 μ§‘μ€‘ν™”ν•˜μ—¬ ν”„λ‘ νŠΈμ—”λ“œμ™€ λ°±μ—”λ“œλ₯Ό κΉ”λ”ν•˜κ²Œ λ””μ»€ν”Œλ§ν•©λ‹ˆλ‹€ [3, 5, 9]. μ „μ—­ μƒνƒœ κ΄€λ¦¬λŠ” μ΅œμ†Œν™”ν•˜λ˜, μ•± 규λͺ¨μ— 따라 [[Context API|Context API]]μ—μ„œ Zustand, 그리고 Redux Toolkit으둜 ν™•μž₯ν•©λ‹ˆλ‹€ [11]. - **디렉토리 뢄리:** μ΅œμƒμœ„ 폴더가 μ„€μ • νŒŒμΌλ“€(`tailwind.config.ts`, `next.config.mjs` λ“±)둜 μ–΄μ§ˆλŸ¬μ§€λŠ” 것을 막기 μœ„ν•΄ `src/` 디렉토리λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€ [10]. ## πŸ”— Knowledge Connections - **Related Topics:** [[CSS Modules|CSS Modules]], Tailwind μ „λž΅, μ‹€λ¬΄μ—μ„œ CSS κ΄€λ¦¬ν•˜λŠ” 방법, [[α„ƒα…΅α„Œα…‘α„‹α…΅α†« 사스템 α„€α…’α„‚α…§α†·|λ””μžμΈ μ‹œμŠ€ν…œ κ°œλ…]] - **Projects/Contexts:** λŒ€κ·œλͺ¨ ν”„λ‘ νŠΈμ—”λ“œ ν”„λ‘œμ νŠΈ μ•„ν‚€ν…μ²˜ ꡬ좕, React [[Server Components|Server Components]] 기반 App Router λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ - **Contradictions/Notes:** μ»΄ν¬λ„ŒνŠΈ λ‹¨μœ„ μŠ€νƒ€μΌλ§μ„ μœ„ν•΄ CSS-in-JS 방식을 μ„ ν˜Έν•  수 μžˆμœΌλ‚˜, Next.js의 ν˜„λŒ€μ μΈ App Router ν™˜κ²½(RSC)μ—μ„œλŠ” μ„±λŠ₯ μ €ν•˜ 및 ν˜Έν™˜μ„± 문제둜 인해 λŸ°νƒ€μž„ CSS-in-JS의 μ‚¬μš©μ΄ κ°•ν•˜κ²Œ μ œν•œλ˜λ©°, λŒ€μ‹  CSS Modulesλ‚˜ Tailwind CSSκ°€ 더 μ•ˆμ „ν•œ λŒ€μ•ˆμœΌλ‘œ μ£Όμž₯되고 μžˆμŠ΅λ‹ˆλ‹€ [6, 8]. --- *Last updated: 2026-04-26*