framework/NextJS

๐Ÿš€ Next.js Pages Router์—์„œ App Router๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ

octo54 2025. 5. 28. 11:17
๋ฐ˜์‘ํ˜•

 

๐Ÿš€ Next.js Pages Router์—์„œ App Router๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ

Next.js 13๋ถ€ํ„ฐ ๋„์ž…๋œ App Router๋Š” ๊ธฐ์กด Pages Router๋ณด๋‹ค ๋” ๋ชจ๋“ˆํ™”๋˜๊ณ  ์œ ์—ฐํ•œ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ๋Š” ๊ธฐ์กด ํ”„๋กœ์ ํŠธ๋ฅผ App Router๋กœ ์ ์ง„์ ์œผ๋กœ ์ด์ „ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹จ๊ณ„๋ณ„๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.


โœ… 1๋‹จ๊ณ„: app ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ

App Router๋Š” app/ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

mkdir app

๋˜๋Š” src/ ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์— ์ƒ์„ฑ:

mkdir src/app

โœ… 2๋‹จ๊ณ„: ๋ฃจํŠธ ๋ ˆ์ด์•„์›ƒ ์ƒ์„ฑ

๋ชจ๋“  ํŽ˜์ด์ง€์— ๊ณตํ†ต์œผ๋กœ ์ ์šฉ๋˜๋Š” app/layout.tsx๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

// app/layout.tsx
export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="ko">
      <body>{children}</body>
    </html>
  );
}

_app.tsx, _document.tsx๋Š” ์ด์ œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


โœ… 3๋‹จ๊ณ„: ํŽ˜์ด์ง€ ์ด์ „

๊ธฐ์กด pages ๋””๋ ‰ํ† ๋ฆฌ์˜ ํŒŒ์ผ์„ app ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์˜ฎ๊น๋‹ˆ๋‹ค.

์ด์ „ ์œ„์น˜ ์ƒˆ๋กœ์šด ์œ„์น˜

pages/index.tsx app/page.tsx
pages/about.tsx app/about/page.tsx

ํด๋” ๊ตฌ์กฐ๊ฐ€ ๊ณง URL์ด ๋˜๋ฉฐ, ๊ฐ ๊ฒฝ๋กœ์—๋Š” page.tsx๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


โœ… 4๋‹จ๊ณ„: ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์„ค์ •

๋ฐ˜์‘ํ˜•

App Router์—์„œ๋Š” next/head ๋Œ€์‹  metadata ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

// app/page.tsx
export const metadata = {
  title: 'ํ™ˆํŽ˜์ด์ง€',
  description: 'Next.js App Router ์˜ˆ์ œ',
};

export default function Page() {
  return <h1>ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!</h1>;
}

โœ… 5๋‹จ๊ณ„: ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๋ณ€๊ฒฝ

getStaticProps, getServerSideProps ๋Œ€์‹  **์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ๋‚ด fetch**๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

async function getPosts() {
  const res = await fetch('https://api.example.com/posts');
  return res.json();
}

export default async function PostsPage() {
  const posts = await getPosts();
  return (
    {posts.map(post =>
  • {post.title}
  • )}
  );
}

โœ… 6๋‹จ๊ณ„: ๋ผ์šฐํŒ… ํ›… ๋ณ€๊ฒฝ

next/router์—์„œ ๊ฐ€์ ธ์˜ค๋˜ useRouter ๋Œ€์‹  ์•„๋ž˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

import { useRouter } from 'next/navigation';

โœ… 7๋‹จ๊ณ„: ์ ์ง„์  ์ด์ „ ๊ฐ€๋Šฅ

App Router์™€ Pages Router๋Š” ๋™์‹œ์— ๊ณต์กดํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ „์ฒด๋ฅผ ํ•œ ๋ฒˆ์— ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ํŽ˜์ด์ง€๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ์ด์ „ํ•˜์„ธ์š”.


โœ… 8๋‹จ๊ณ„: ์—๋Ÿฌ ํŽ˜์ด์ง€ ๊ตฌ์„ฑ

  • app/error.tsx → ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ ์ฒ˜๋ฆฌ
  • app/not-found.tsx → 404 ์ฒ˜๋ฆฌ
// app/error.tsx
'use client';
export default function Error() {
  return <h2>์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.</h2>;
}
// app/not-found.tsx
export default function NotFound() {
  return <h2>ํŽ˜์ด์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.</h2>;
}

โœ… 9๋‹จ๊ณ„: API ๋ผ์šฐํŠธ ๋ณ€๊ฒฝ

App Router์—์„œ๋Š” pages/api ๋Œ€์‹  app/api ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

// app/api/hello/route.ts
export async function GET() {
  return new Response('์•ˆ๋…•ํ•˜์„ธ์š”!');
}

โœ… 10๋‹จ๊ณ„: ๊ธ€๋กœ๋ฒŒ ์Šคํƒ€์ผ ๋ฐ ์ƒํƒœ๊ด€๋ฆฌ

๊ธ€๋กœ๋ฒŒ CSS๋Š” globals.css๋กœ ์œ ์ง€ํ•˜๊ณ  layout.tsx์—์„œ importํ•ฉ๋‹ˆ๋‹ค.

// app/layout.tsx
import './globals.css';

์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” use client๋ฅผ ๋ถ™์ธ Provider๋กœ wrapping ํ•ฉ๋‹ˆ๋‹ค.

// app/providers.tsx
'use client';
import { Provider } from 'react-redux';
import { store } from './store';

export function Providers({ children }: { children: React.ReactNode }) {
  return <Provider store={store}>{children}</Provider>;
}

๊ทธ๋ฆฌ๊ณ  layout์—์„œ ์‚ฌ์šฉ:

import { Providers } from './providers';

export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="ko">
      <body>
        <Providers>{children}</Providers>
      </body>
    </html>
  );
}

โœ… ์š”์•ฝ ๋น„๊ตํ‘œ

ํ•ญ๋ชฉ Pages Router App Router

๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ pages/ app/
๊ณตํ†ต ๋ ˆ์ด์•„์›ƒ _app.tsx / _document.tsx layout.tsx
๋ฐ์ดํ„ฐ ํŽ˜์นญ getStaticProps ๋“ฑ fetch (์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ)
๋ฉ”ํƒ€๋ฐ์ดํ„ฐ next/head metadata ๊ฐ์ฒด
API ๋ผ์šฐํŠธ pages/api/ app/api/ (route.ts)
์—๋Ÿฌ ํ•ธ๋“ค๋ง _error.tsx / 404.tsx error.tsx / not-found.tsx

 

Next.js, App Router, ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜, pages ๋””๋ ‰ํ† ๋ฆฌ, layout ๊ตฌ์„ฑ, ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ, metadata ์„ค์ •, API route, ์—๋Ÿฌ ํŽ˜์ด์ง€, ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ, ๊ธ€๋กœ๋ฒŒ ์Šคํƒ€์ผ๋ง, ์ ์ง„์  ์ด์ „, Next 13+ ๊ตฌ์กฐ