ํ ์ ํฌ๊ธฐ๋ก ์๋ผ๋จน๋ Next.js ํ์ต์ ๋ฆฌ์ฉ์ ๋๋ค.
3.2) ํ์ด์ง ๋ผ์ฐํ ์ค์ ํ๊ธฐ
3.2 ํ์ด์ง ๋ผ์ฐํ ์ค์ ํ๊ธฐ
Page Router vs App Router
๊ณตํต์
- ํด๋๊ธฐ๋ฐ ํ์ด์ง ๋ผ์ฐํ ์ด ๊ฐ๋ฅํ๋ค.
์ฐจ์ด์
- Page Router : ํน์ ํด๋ ์์ index.tsx๊ฐ ํ์ด์ง ์ปดํฌ๋ํธ ์ญํ , ๊ฒฝ๋ก.tsx(ex. search.tsx) ์ญ์ ํ์ด์ง ๊ฒฝ๋ก(/search)๋ก ๊ตฌ๋ถ ๊ฐ๋ฅ
- App Router : page.tsx๊ฐ ํ์ด์ง ์ปดํฌ๋ํธ ์ญํ ์ ํจ, ๋ฌด์กฐ๊ฑด page.tsx๋ก ํ์ด์ง ์ปดํฌ๋ํธ๋ฅผ ์ง์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฒฝ๋ก ํด๋๊ฐ ํ์
App Router์ query string ๋ฐ์์ค๊ธฐ
App Router์์๋ ํ์ด์ง ์ปดํฌ๋ํธ์๊ฒ ์๋์ผ๋ก ์ ๋ฌ์ด ๋๋ Props์๋ ์ฟผ๋ฆฌ ์คํธ๋ง์ด๋ URL ํ๋ผ๋ฏธํฐ์ ๊ฐ์ ๊ฐ๋ค์ด ํฌํจ๋๋ค.
{
params: Promise { // URL parameter
<pending>,
[Symbol(async_id_symbol)]: 56857,
[Symbol(trigger_async_id_symbol)]: 56856,
[Symbol(kResourceStore)]: {
isStaticGeneration: false,
page: '/search/page',
fallbackRouteParams: null,
route: '/search',
incrementalCache: [IncrementalCache],
cacheLifeProfiles: [Object],
isRevalidate: false,
isPrerendering: undefined,
fetchCache: undefined,
isOnDemandRevalidate: false,
isDraftMode: false,
requestEndedState: [Object],
isPrefetchRequest: false,
buildId: 'development',
reactLoadableManifest: {},
assetPrefix: '',
afterContext: [AfterContext],
dynamicIOEnabled: false,
dev: true,
previouslyRevalidatedTags: [],
refreshTagsByCacheKind: [Map],
fetchMetrics: []
},
...
},
searchParams: Promise {
<pending>,
[Symbol(async_id_symbol)]: 56798,
[Symbol(trigger_async_id_symbol)]: 56792,
[Symbol(kResourceStore)]: {
isStaticGeneration: false,
page: '/search/page',
fallbackRouteParams: null,
route: '/search',
incrementalCache: [IncrementalCache],
cacheLifeProfiles: [Object],
isRevalidate: false,
isPrerendering: undefined,
fetchCache: undefined,
isOnDemandRevalidate: false,
isDraftMode: false,
requestEndedState: [Object],
isPrefetchRequest: false,
buildId: 'development',
reactLoadableManifest: {},
assetPrefix: '',
afterContext: [AfterContext],
dynamicIOEnabled: false,
dev: true,
previouslyRevalidatedTags: [],
refreshTagsByCacheKind: [Map],
fetchMetrics: []
},
...
}
}
๋ฐ๋ผ์ ์ด props๋ฅผ ํ์ฉํด์ query string๋ฅผ ๋ฐ์์ฌ ์ ์๋ค.
export default async function Page({
searchParams,
}: {
searchParams: Promise<{ q: string }>;
}) {
const { q } = await searchParams;
return <div>Search ํ์ด์ง : {q}</div>;
}
URL Parameter๋ฅผ ํฌํจํ๋ ํ์ด์ง
๋์ ๊ฒฝ๋ก๋ฅผ ์ค์ ํ๊ธฐ ์ํด [id] ์ ๊ฐ์ด ๋๊ดํธ๊ฐ ํฌํจ๋ ํด๋๋ฅผ ์์ฑํ๊ณ , ๋ด๋ถ์ page.tsx๋ฅผ ์์ฑํด์ค๋ค.
.
โโ book
โโโ [id]
โโโ page.tsx
URL Parameter ๊บผ๋ด์ค๊ธฐ
export default async function Page({
params,
}: {
params: Promise<{ id: string }>;
}) {
const { id } = await params;
return <div>book/[id] ํ์ด์ง : {id}</div>;
}
Catch All Segment / Optional Catch All Segment
[...id] : book/1/1๊ณผ ๊ฐ์ ํ์ด์ง์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋๋ก Catch All Segment๋ฅผ ์ค์ ํด์ค ์ ์๋ค.
[[...id]] : Catch All Segment๋ก๋ /book ์ ์ ๊ทผ ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ Optional Catch All Segment๋ก ์ ๊ทผ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค ์ ์๋ค.
'FE > Next.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Next.js] ๋ฆฌ์กํธ ์๋ฒ ์ปดํฌ๋ํธ (2) | 2025.05.07 |
---|---|
[Next.js] App Router - ๋ ์ด์์ (0) | 2025.05.06 |
[Next.js] Page Router ์ฅ๋จ์ (0) | 2025.05.06 |
[Next.js] Page Router - ISR (4) | 2025.05.06 |
[Next.js] page router - SSG(์ ์ ์ฌ์ดํธ ์์ฑ) (1) | 2025.05.06 |