Dynamic Routes — 동적 라우트
Next.js는 대괄호를 사용해 동적 URL 세그먼트를 정의합니다. 3가지 패턴이 있으며, 각각 캡처하는 세그먼트 수가 다릅니다.
파일 구조
dynamic-routes/
├── page.tsx ← 이 페이지 (인덱스)
├── blog/
│ └── [slug]/
│ └── page.tsx ← /blog/:slug (단일 파라미터)
├── shop/
│ └── [...slug]/
│ └── page.tsx ← /shop/* (catch-all)
└── docs/
└── [[...slug]]/
└── page.tsx ← /docs/* (optional catch-all)[...slug] — Catch-all
1개 이상의 URL 세그먼트를 배열로 캡처합니다. 최소 1개 세그먼트가 필수입니다.
[[...slug]] — Optional Catch-all
0개 이상의 URL 세그먼트를 캡처합니다. /docs 자체(세그먼트 0개)도 매칭됩니다.
핵심 파일 코드
// demo/nextjs/16.1.6/project-structure/dynamic-routes/page.tsx
app/blog/[slug]/page.tsx // 단일 세그먼트
app/shop/[...slug]/page.tsx // 1개 이상 세그먼트
app/docs/[[...slug]]/page.tsx // 0개 이상 세그먼트
const { slug } = await params
// [slug] -> slug: string
// [...slug] -> slug: string[]
// [[...slug]] -> slug: string[] | undefined