Next.js 16 κΈ°λ°μ κ°μΈ κ°λ° λΈλ‘κ·Έλ‘, Feature-Sliced Design(FSD) μν€ν μ²μ μ΄μ€ 리ν¬μ§ν°λ¦¬ ꡬ쑰λ₯Ό νΉμ§μΌλ‘ ν©λλ€.
| νλͺ© | λ΄μ© |
|---|---|
| νλ μμν¬ | Next.js 16.0.10 + React 19.2.3 |
| μ€νμΌλ§ | Tailwind CSS v4 |
| μν κ΄λ¦¬ | Zustand |
| ν μ€ν | Vitest + Playwright + Storybook |
| λ°°ν¬ | Netlify |
- π κ°μΈμ© κ°λ° λΈλ‘κ·Έ μ΄μ
- π λͺ¨λν νλ‘ νΈμλ κΈ°μ μ€ν 체λ
- π κΈ°μ μ§μ 곡μ (νκ΅μ΄, μΌλ³Έμ΄, μμ΄)
λΈλ‘κ·Έλ λ κ°μ λ 립μ μΈ λ¦¬ν¬μ§ν°λ¦¬λ‘ ꡬμ±λ©λλ€:
- blog (νμ¬ λ¦¬ν¬μ§ν°λ¦¬) - Next.js 16 κΈ°λ° λΈλ‘κ·Έ μ ν리μΌμ΄μ
- blog-content - MDX νμμ ν¬μ€νΈ μ½ν μΈ μ μ₯μ
graph LR
A[blog 리ν¬μ§ν°λ¦¬] -->|main λΈλμΉ push| B[Netlify μλ λ°°ν¬]
C[blog-content 리ν¬μ§ν°λ¦¬] -->|main λΈλμΉ push| D[GitHub Actions]
D -->|generate-index.ts| E[index.json μμ±]
B -->|fetch| E
B -->|λ λλ§| F[GitHub Raw URL]
| λꡬ | λ²μ | νμΈ λͺ λ Ήμ΄ |
|---|---|---|
| Node.js | 22.x μ΄μ | node -v |
| pnpm | 10.x μ΄μ | pnpm -v |
# μμ‘΄μ± μ€μΉ
pnpm install
# κ°λ° μλ² μμ (http://localhost:3000)
pnpm dev
# Netlify Functionsμ ν¨κ» μμ (http://localhost:8888)
pnpm dev:server.env.local νμΌμ μμ±νκ³ νμν νκ²½ λ³μλ₯Ό μ€μ ν©λλ€:
# μ½ν
μΈ λ¦¬ν¬μ§ν°λ¦¬ (νμ)
NEXT_PUBLIC_GIT_RAW_URL=https://raw.githubusercontent.com/chan-ok/blog-content/main
# Cloudflare Turnstile (Contact νΌμ©)
NEXT_PUBLIC_TURNSTILE_SITE_KEY=your_site_key
TURNSTILE_SECRET_KEY=your_secret_key
# Resend (μ΄λ©μΌ λ°μ‘μ©)
RESEND_API_KEY=re_xxxxxxxxxxxxxxxxxxxx
β οΈ .env.localμ μ λ Gitμ 컀λ°νμ§ λ§μΈμ!
# κ°λ°
pnpm dev # κ°λ° μλ² μμ
pnpm dev:server # Netlify Functionsμ ν¨κ» μμ
pnpm build # νλ‘λμ
λΉλ
pnpm start # νλ‘λμ
μλ² μμ
# μ½λ νμ§
pnpm lint # ESLint μ€ν
pnpm fmt # Prettier ν¬λ§·ν
# ν
μ€ν
pnpm test # Vitest ν
μ€νΈ μ€ν
pnpm coverage # ν
μ€νΈ 컀λ²λ¦¬μ§ νμΈ
pnpm e2e # Playwright E2E ν
μ€νΈ
# Storybook
pnpm storybook # Storybook μ€ν (localhost:6006)
pnpm build-storybook # Storybook λΉλblog/
βββ src/
β βββ app/ # Next.js App Router (λΌμ°ν
)
β βββ features/ # λΉμ¦λμ€ κΈ°λ₯ (about, contact, post)
β βββ entities/ # λΉμ¦λμ€ μν°ν° (markdown)
β βββ widgets/ # λ³΅ν© UI (header, footer)
β βββ shared/ # 곡μ 리μμ€
β βββ components/ # λ³΅ν© μ»΄ν¬λνΈ (μ 기체 μ΄μ)
β β βββ toggle/ # ν κΈ (locale, theme)
β β βββ turnstile/ # Cloudflare Turnstile
β β βββ ui/ # μμ UI (μμ, λΆμ)
β βββ config/ # μ€μ (API λ±)
β βββ hooks/ # 컀μ€ν
ν
β βββ providers/ # Context providers
β βββ stores/ # Zustand stores
β βββ types/ # TypeScript νμ
βββ netlify/functions/ # μλ²λ¦¬μ€ ν¨μ
βββ e2e/ # E2E ν
μ€νΈ
βββ docs/ # π κ°λ° λ¬Έμ
| λ¬Έμ | μ€λͺ | μΈμ μ½λμ? |
|---|---|---|
| λΉ λ₯Έ μμ κ°μ΄λ | κ°λ° νκ²½ μ€μ λ° μ²« κΈ°μ¬ | νλ‘μ νΈ μμ μ |
| κ°λ° κ·μΉ | ν΅μ¬ κ°λ° μμΉ λ° κ·μΉ | μ½λ μμ± μ |
| μν€ν μ² | FSD ꡬ쑰 λ° μ½ν μΈ νμ΄νλΌμΈ | μ κΈ°λ₯ κ°λ° μ |
| λ¬Έμ | μ€λͺ | μΈμ μ½λμ? |
|---|---|---|
| μ½λ μ€νμΌ κ°μ΄λ | TypeScript, Tailwind, μ»΄ν¬λνΈ μμ± κ·μΉ | μ½λ μμ± μ |
| ν μ€ν κ°μ΄λ | Vitest, Playwright, Storybook μ¬μ©λ² | ν μ€νΈ μμ± μ |
| 보μ κ°μ΄λ | νκ²½ λ³μ, XSS λ°©μ§, λ΄ λ°©μ§ | 보μ κ΄λ ¨ μμ μ |
| Git κ°μ΄λ | μ»€λ° λ©μμ§, λΈλμΉ μ λ΅ | μ»€λ° μ |
| λ¬Έμ | μ€λͺ | μΈμ μ½λμ? |
|---|---|---|
| λ°°ν¬ κ°μ΄λ | Netlify λ°°ν¬ λ° νκ²½ λ³μ μ€μ | λ°°ν¬ μ |
| Kiro Hooks κ°μ΄λ | AI μλν ν μ¬μ©λ² | Kiro μ¬μ© μ |
| AI κ²μ¦ 체ν¬λ¦¬μ€νΈ | AI λ΅λ³ κ²μ¦ λ°©λ² | AI μ½λ μ μ© μ |
| λ¬Έμ | μ€λͺ |
|---|---|
| μμ¬κ²°μ λ‘κ·Έ | μΈκ°-AI νμ μμ¬κ²°μ μΆμ |
| ꡬν κ³ν | κΈ°μ μ€ν λ° μ§ν μν© |
| λ³κ²½ λ‘κ·Έ | λ²μ λ³ λ³κ²½ λ΄μ |
| ν μΌ λͺ©λ‘ | λ¨μ μμ λͺ©λ‘ |
- π Netlify λ°°ν¬ - μλ λΉλ λ° λ°°ν¬
- π λ€κ΅μ΄ μ§μ - URL κΈ°λ° (νκ΅μ΄, μΌλ³Έμ΄, μμ΄) + i18next UI λ²μ
- π¨ MDX λ λλ§ - μ½λ νμ΄λΌμ΄ν ν¬ν¨
- π About νμ΄μ§ - λ§ν¬λ€μ΄ κΈ°λ°
- π° Posts νμ΄μ§ - blog-content 리ν¬μ§ν°λ¦¬ μ°λ
- π¬ Contact νΌ - Zod κ²μ¦ + Turnstile + Resend
- π λ€ν¬ λͺ¨λ - Zustand + LocalStorage μ§μμ±
- π μΈμ΄ μ νκΈ° - URL κ²½λ‘ κΈ°λ° + Zustand
- π¬ λκΈ μμ€ν - Giscus (GitHub Discussions κΈ°λ°)
- π λ§ν¬λ€μ΄ κ³ κΈν - μ½λ λΈλ‘ κ°μ , TOC, Reading time
- π ννλ©΄ λμμΈ κ°μ - μ΅μ /μΈκΈ° ν¬μ€νΈ, ꡬλ νΌ
- π κ²μ κΈ°λ₯ - ν΄λΌμ΄μΈνΈ μ¬μ΄λ λλ Algolia
νλ‘μ νΈμλ κ°λ° μν¬νλ‘μ°λ₯Ό μλννλ Agent Hooksκ° μ€μ λμ΄ μμ΅λλ€.
| ν | μν | νΈλ¦¬κ±° |
|---|---|---|
| π Auto Documentation | λ¬Έμ μλ μ λ°μ΄νΈ | μλ μ€ν (κΈ°λ₯ μμ± ν) |
μμΈν μ¬μ©λ²μ Kiro Hooks κ°μ΄λλ₯Ό μ°Έκ³ νμΈμ.
- Feature-Sliced Design - μν€ν μ² ν¨ν΄
- Next.js λ¬Έμ - νλ μμν¬
- Tailwind CSS v4 - μ€νμΌλ§
MIT