[Daily morning study] Next.js์ App Router์ Pages Router ๋น๊ต
#daily morning study
Next.js์ App Router์ Pages Router ๋น๊ต
Next.js๋ ๋ฆฌ์กํธ ๊ธฐ๋ฐ์ ํ๋ ์์ํฌ๋ก, ํจ์จ์ ์ธ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง ๋ฐ ์ ์ ์ฌ์ดํธ ์์ฑ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. Next.js 13๋ฒ์ ๋ถํฐ ๋์
๋ App Router๋ ์ด์ ์ Pages Router์ ๋ง์ ์ฐจ์ด์ ์ ๊ฐ์ง๋ฉฐ, ๊ฐ๊ฐ์ ์ฅ๋จ์ ์ด ์กด์ฌํฉ๋๋ค. ์ด ๋ฌธ์์์๋ ๋ ๋ผ์ฐํฐ์ ๊ตฌ์กฐ์ ๊ธฐ๋ฅ, ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋ํด ์์ธํ ์ดํด๋ณด๋๋ก ํ๊ฒ ๋ค.
1. ๊ธฐ๋ณธ ๊ฐ๋ ๋ฐ ๋ชฉ์
1.1. Pages Router
- ์์น:
pages๋๋ ํ ๋ฆฌ์์ ๊ฒฝ๋ก๋ฅผ ๋งคํ - ๋ฐฉ์: ๊ธฐ๋ณธ์ ์ธ ํ์ผ ๊ธฐ๋ฐ ๋ผ์ฐํ
- ํน์ง:
- ๊ฐ๊ฐ์ ํ์ผ์ด URL ๊ฒฝ๋ก์ ์ง์ ๋์
- ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๊ฐ URL ๊ตฌ์กฐ๋ฅผ ๋ฐ์
1.2. App Router
- ์์น:
app๋๋ ํ ๋ฆฌ์์ ๊ฒฝ๋ก๋ฅผ ๋งคํ - ๋ฐฉ์: ๋ ๋ง์ ์ ์ฐ์ฑ๊ณผ ๊ธฐ๋ฅ์ฑ์ ์ ๊ณตํ๋ ํ์ผ ๊ธฐ๋ฐ ๋ผ์ฐํ
- ํน์ง:
- ๋ ์ด์์, ์ค๋ฅ ์ฒ๋ฆฌ, ๋ฐ์ดํฐ ํ์นญ ๊ฐ์ ์ฌ๋ฌ ๊ธฐ๋ฅ ํตํฉ
- ๋น๋๊ธฐ์ ์ธ UI ๋ ๋๋ง ๋ฐ ๋ณด๋ค ๋์ ์ฑ๋ฅ ์ง์
2. ๊ตฌ์กฐ ๋น๊ต
2.1. Pages Router ๊ตฌ์กฐ
pages ๋๋ ํ ๋ฆฌ ์:
/pages
โโโ index.js // /
โโโ about.js // /about
โโโ blog
โ โโโ index.js // /blog
โ โโโ [id].js // /blog/:id
2.2. App Router ๊ตฌ์กฐ
app ๋๋ ํ ๋ฆฌ ์:
/app
โโโ page.js // /
โโโ about
โ โโโ page.js // /about
โโโ blog
โ โโโ page.js // /blog
โ โโโ [id]
โ โ โโโ page.js // /blog/:id
3. ๋ฐ์ดํฐ ํ์นญ
3.1. Pages Router ๋ฐ์ดํฐ ํ์นญ
- ๋ฐ์ดํฐ ํ์นญ์ ์ฃผ๋ก
getStaticProps,getServerSideProps์ ๊ฐ์ ํจ์ ํตํด ์ฒ๋ฆฌ - ์์:
getStaticProps๋ฅผ ์ฌ์ฉํ ์ ์ ์ฌ์ดํธ ์์ฑ ```javascript // pages/blog/[id].js
export async function getStaticProps({ params }) { const post = await fetch(https://api.example.com/posts/${params.id}); return { props: { post } }; }
### 3.2. App Router ๋ฐ์ดํฐ ํ์นญ
- ๊ธฐ๋ณธ์ ์ผ๋ก React์ `Suspense`๋ฅผ ํ์ฉํ์ฌ ๋น๋๊ธฐ์ ๋ฐ์ดํฐ ๋ก๋ฉ ์ฒ๋ฆฌ
- ์ข ๋ ๊ฐ๋จํ๊ฒ ๋ฐ์ดํฐ ์์ฒญ ๊ฐ๋ฅ
```javascript
// app/blog/[id]/page.js
async function getPost(id) {
const res = await fetch(`https://api.example.com/posts/${id}`);
return res.json();
}
export default async function Post({ params }) {
const post = await getPost(params.id);
return <div>{post.title}</div>;
}
4. ๋ ์ด์์ ๋ฐ ์๋ฌ ํธ๋ค๋ง
4.1. Pages Router์์์ ๋ ์ด์์
- ๋ ์ด์์์ ์ํ ์ฌ์ฌ์ฉ์ฑ ๋ฎ์
- ์ค๋ณต์ ํผํ๊ธฐ ์ํด HOC ๋๋ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํด์ผ ํจ
4.2. App Router์์์ ๋ ์ด์์
- ๊ฐ๋จํ๊ฒ
layout.jsํ์ผ์ ์์ฑํ์ฌ ์ ์ฒด์ ์ธ ๋ ์ด์์์ ๊ด๋ฆฌํ ์ ์์ - ์์: ```javascript // app/layout.js
export default function RootLayout({ children }) { return ( <html lang="en"> <body> <header>My Header</header> {children} <footer>My Footer</footer> </body> </html> ); }
### 4.3. ์๋ฌ ํ์ด์ง ์ฒ๋ฆฌ
- App Router์์๋ `error.js` ํ์ผ์ ํตํด ์๋ฌ๋ฅผ ํธ๋ค๋งํ ์ ์๋ค.
```javascript
// app/error.js
export default function Error({ error }) {
return <div>Error occurred: {error.message}</div>;
}
5. ์ฑ๋ฅ ๋น๊ต
- Pages Router: ํ์ผ ๊ธฐ๋ฐ ๋ผ์ฐํ ์ ๋ฐ๋ผ ํ์ด์ง๋ง๋ค ๋ฐ์ดํฐ ์์ฒญ์ด ์ด๋ฃจ์ด์ ธ ๋ฆ์ ๋ก๋ ์๊ฐ ๋ฐ์ ๊ฐ๋ฅ
- App Router: React์
Suspense์ ๋๋ถ์ด ์ค์ฒฉ๋ ๋ผ์ฐํธ์์์ ๋ฐ์ดํฐ ๋ก๋ฉ์ผ๋ก ๋ ๋น ๋ฅธ ๋ ๋๋ง ๊ฐ๋ฅ
6. ๊ฒฐ๋ก
Next.js์ App Router๋ ๋ ๋์ ์ ์ฐ์ฑ๊ณผ ์ฑ๋ฅ์ ์ ๊ณตํ๋ฉด์๋ ๋ ๋ณต์กํ ๋ฐ์ดํฐ ๋ก๋ฉ ๋ฐ ๋ ์ด์์ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํด์ก๋ค. ๋ฐ๋ฉด, Pages Router๋ ์๋์ ์ผ๋ก ๋จ์ํ๊ณ ์ดํดํ๊ธฐ ์ฌ์ด ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ๋ฏ๋ก ๊ธฐ์กด ํ๋ก์ ํธ์ ์ ์ง๋ณด์๋ ๋จ์ํ ์น์ฌ์ดํธ์ ์ ํฉํ ์ ์๋ค. ๊ฐ ํ๋ก์ ํธ์ ์๊ตฌ์ฌํญ์ ๋ง์ถฐ ์ ์ ํ ๋ผ์ฐํ
๋ฐฉ์์ ์ ํํ๋ ๊ฒ์ด ์ค์ํ๋ค.