โ์ด๊ฑด ๋จ์ํ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ ์ฐจ์ด๊ฐ ์๋์์ต๋๋คโฆ ๋ฌธ๋ช ์ ํ์ด์์ฃ !โ โ ์ด๋ณด์๋ฅผ ์ํ ๋น๊ต & ์ฌ์ฉ๊ธฐ
**๋ผ์ฐํ (Routing)**์ ๋ง ๊ทธ๋๋ก โ๊ธธ ์ฐพ๊ธฐโ์ ๋๋ค.
์น์์ ์ฃผ์์ฐฝ์ https://example.com/about
์ ์
๋ ฅํ๋ฉด,
์ด๋ป๊ฒ React ์ฑ์ ์๋์ผ๋ก /about
์ ํด๋นํ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ์ค๊น์?
๐ ๋ฐ๋ก ๋ผ์ฐํฐ๊ฐ ๊ทธ ์ญํ ์ ํฉ๋๋ค!
URL์ ๋ฐ๋ผ ์ด๋ค ์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ์ค์ง ์ ํด์ฃผ๋ ์์คํ .
Next.js์์๋ ํด๋์ ํ์ผ ๊ตฌ์กฐ๋ง์ผ๋ก ์ด๊ฑธ ์ฝ๊ฒ ๋ง๋ค ์ ์์ด์!
๐ ๊ตฌ์กฐ๋ ์ ๋ง ๊ฐ๋จํด์:
pages/
โโโ index.tsx // /
โโโ about.tsx // /about
โโโ blog/
โโโ [slug].tsx // /blog/:slug
๐ถ ์ด๋ณด์ ์ฝ๋ฉํธ:
๋ฑ ๋ด๋ โ์ด ํ์ผ์ด ์ด๋ค ์ฃผ์๋ก ์ฐ๊ฒฐ๋ ์งโ ๋ฐ๋ก ๋ณด์ด์ฃ !
๊ทธ๋์ ์ ๋ฌธ์๋ค์ด ์ฒ์ Next.js๋ฅผ ๋ฐฐ์ธ ๋ ๋ถ๋ด์ด ์ ์ด์.
_app.tsx
, _error.tsx
์ ๋ชฐ๋ฆผNext.js 13๋ถํฐ ๋์ ๋ app ๋๋ ํ ๋ฆฌ ๊ธฐ๋ฐ์ ๋ผ์ฐํฐ์ ๋๋ค.
app/
โโโ layout.tsx // ์ ์ฒด ๋ ์ด์์
โโโ page.tsx // /
โโโ about/
โ โโโ page.tsx // /about
โโโ blog/
โ โโโ [slug]/
โ โโโ page.tsx // /blog/:slug
โ โโโ loading.tsx // ๋ก๋ฉ UI
โ โโโ error.tsx // ์๋ฌ UI
๐ถ ์ด๋ณด์ ์ฝ๋ฉํธ:
์ฒ์ ๋ณด๋ฉด ๋ณต์กํด ๋ณด์ผ ์ ์์ง๋ง, ์ค์ ๋ก๋ ์ญํ ์ด ๋ช ํํ๊ฒ ๋๋์ด ์์ด์
์ ์ง๋ณด์๋ ํ์ฅ์ฑ ๋ฉด์์๋ ํจ์ฌ ํธํด์!
ํด๋น ํด๋์ ๋ชจ๋ ํ์ ํ์ด์ง์ ๊ณตํต์ผ๋ก ์ ์ฉ๋๋ ๋ ์ด์์.
์๋ฅผ ๋ค์ด ์ฌ์ด๋๋ฐ, ํค๋, ๊ณตํต ๋ค๋น๊ฒ์ด์ ์ ์ด๊ณณ์ ๋ฌ์.
'use client'
์ ์ธ์ด ๋ฏ์ค ์ ์์// pages/blog/[slug].tsx
export async function getServerSideProps(context) {
const post = await fetchPost(context.params.slug);
return { props: { post } };
}
export default function PostPage({ post }) {
return <div>{post.title}</div>;
}
// app/blog/[slug]/page.tsx
export default async function PostPage({ params }) {
const post = await fetchPost(params.slug);
return <div>{post.title}</div>;
}
๐ ์ฉ์ด ์ค๋ช : params
URL์์
[slug]
์ ๋ค์ด๊ฐ๋ ๊ฐ์ ๊ฐ์ ธ์ค๋ ๊ฐ์ฒด์์.
์:/blog/hello-world
โparams.slug === "hello-world"
๋น์ | Pages Router | App Router |
---|---|---|
๐ ๋ผ๋ฉด | ๋ชจ๋ ๊ฑธ ํ ํ์ผ์ ์์ โ ๋น ๋ฅด์ง๋ง ๋ณต์กํจ | โ |
๐ฑ ๋์๋ฝ | ๋ฐ์ฐฌ๋ณ๋ก ์นธ ๋๋ โ ๊น๋ํ๊ณ ํ์ฅ์ฑ ์ข์ | โ |
๐ถ ์ด๋ณด์ ํ:
ํ๋ก์ ํธ๊ฐ ์ปค์ง๋ฉด ๊ฒฐ๊ตญ ๋์๋ฝ ๊ตฌ์กฐ๊ฐ ํจ์ฌ ๊ด๋ฆฌํ๊ธฐ ์ฌ์์.
ํ ํ๋ก์ ํธ์์๋ App Router๊ฐ ํจ์ฌ ์ ๋ฆฌํฉ๋๋ค!
pages/
๊ตฌ์กฐ๋ก ๊ฐ๋ฐํ๋ค๊ฐ ๋๋ฌด ๋ณต์กํด์ ธ์ App Router๋ก ์ ํlayout.tsx
ํ๋๋ก ๋ ์ด์์ ์ฌ์ฌ์ฉ์ด ํธํ๊ณ loading.tsx
, error.tsx
๊ฐ์ ๋ถ๋ฆฌ ๊ตฌ์กฐ ๋๋ถ์ ๋์์ด๋ ํ์
๋ ์ฌ์์ก์๐ ์ฉ์ด ์ค๋ช : Supabase
Firebase ๋์ฒด ์๋น์ค. DB๋ฅผ ์ฝ๊ฒ ์ฐ๊ฒฐํ๊ณ ์ฌ์ฉํ ์ ์์ด์.
pages/
์์ ์ฐ๋ ์ปดํฌ๋ํธ๋ฅผ ๊ทธ๋๋ก app/
์ผ๋ก ๋ณต์ฌlayout.tsx
๋ก ๋ถ๋ฆฌ'use client'
์ ์ธ์ํฉ | ์ถ์ฒ ๋ฐฉ์ |
---|---|
๋น ๋ฅด๊ฒ MVP ๋ง๋ค๊ธฐ | Pages Router โ |
์ ์ ์ฌ์ดํธ, ๋ธ๋ก๊ทธ | Pages Router โ |
๋ฐ์ดํฐ ํจ์นญ ๋ง์ SaaS ์๋น์ค | App Router โ |
ํ์ ๋ง๊ณ ๊ตฌ์กฐ๊ฐ ํฐ ํ๋ก์ ํธ | App Router โ |
SSR + RSC + ์ค์ฒฉ ๋ผ์ฐํ ์ํ๋ ๊ฒฝ์ฐ | App Router โ |