[Daily morning study] Next.js์˜ App Router์™€ Pages Router ๋น„๊ต

#daily morning study

Image


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๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ๋‹จ์ˆœํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์˜ ์œ ์ง€๋ณด์ˆ˜๋‚˜ ๋‹จ์ˆœํ•œ ์›น์‚ฌ์ดํŠธ์— ์ ํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž์ถฐ ์ ์ ˆํ•œ ๋ผ์šฐํŒ… ๋ฐฉ์‹์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.