0Pricing
Frontend Academy · 강의

Pages Router와 App Router 비교

Next.js 라우팅 방식인 file 기반 Pages Router와 중첩 레이아웃, 로딩, 오류 경계를 지원하는 새로운 App Router를 비교합니다.

Pages Router와 App Router 비교은(는) CoddyKit의 무료 Frontend Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Frontend Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Frontend Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

라우터 두 개, 프레임워크 하나

Next.js에는 두 가지 라우팅 시스템이 있습니다. 기존의 페이지 라우터(pages/ 디렉터리)와 새로운 앱 라우터(app/ 디렉터리, Next 13 이상)입니다. 두 시스템 모두 Next 14/15에서 계속 작동합니다.

페이지 라우터 — 파일 기반 라우팅

pages/ 아래의 각 파일이 라우트가 됩니다. 동적 세그먼트에는 대괄호를 사용합니다. pages/users/[id].tsx는 /users/123와 일치합니다.

pages/
  index.tsx        // route: /
  about.tsx        // route: /about
  blog/
    index.tsx      // route: /blog
    [slug].tsx     // route: /blog/:slug
  api/
    users.ts       // API route: /api/users

페이지 라우터 — 데이터 가져오기

특수 내보내기로 데이터 가져오기 동작을 선언합니다. getStaticProps(SSG), getServerSideProps(SSR), getStaticPaths(동적 라우트가 있는 SSG)를 사용합니다.

// pages/posts/[slug].tsx
export async function getStaticPaths() {
  const slugs = await fetchAllSlugs();
  return { paths: slugs.map(s => ({ params: { slug: s } })), fallback: false };
}

export async function getStaticProps({ params }) {
  const post = await fetchPost(params.slug);
  return { props: { post }, revalidate: 60 };
}

export default function Post({ post }) {
  return <article>{post.body}</article>;
}

앱 라우터 — 폴더 기반 라우팅

앱 라우터는 폴더를 라우트 세그먼트로 사용합니다. 폴더 안의 page.tsx 파일이 해당 페이지를 정의합니다.

app/
  layout.tsx       // shared root layout
  page.tsx         // route: /
  about/
    page.tsx       // route: /about
  blog/
    page.tsx       // route: /blog
    [slug]/
      page.tsx     // route: /blog/:slug

앱 라우터 — 특수 파일

세그먼트별 파일은 강력한 기본 기능을 제공합니다. layout.tsx(하위 요소를 감싸는 지속적인 UI), loading.tsx(Suspense 대체 화면), error.tsx(오류 경계), not-found.tsx가 있습니다.

중첩 레이아웃

앱 라우터의 레이아웃은 중첩된 라우트를 감싸며 탐색하는 동안 유지됩니다. 다시 마운트되지 않습니다.

// app/dashboard/layout.tsx
export default function DashboardLayout({ children }) {
  return (
    <div className="dashboard">
      <Sidebar />
      <main>{children}</main>
    </div>
  );
}

// app/dashboard/settings/page.tsx renders inside the Sidebar layout

앱 라우터의 데이터 가져오기

서버 컴포넌트는 비동기일 수 있고 직접 데이터를 가져올 수 있으므로 getServerSideProps/getStaticProps가 필요하지 않습니다. 컴포넌트는 서버에서 실행되고 클라이언트에는 HTML만 전송됩니다.

// app/posts/[slug]/page.tsx (Server Component by default)
export default async function Post({ params }) {
  const post = await fetch(`https://api/posts/${params.slug}`, {
    next: { revalidate: 60 } // ISR-like caching
  }).then(r => r.json());
  return <article>{post.body}</article>;
}

앱 라우터의 클라이언트 컴포넌트

파일 상단에 'use client'를 추가하면 해당 컴포넌트를 클라이언트 컴포넌트로 표시할 수 있습니다. 이 컴포넌트는 상호작용이 가능하며 브라우저에서 실행됩니다.

// app/Counter.tsx
'use client';
import { useState } from 'react';

export default function Counter() {
  const [count, setCount] = useState(0);
  return <button onClick={() => setCount(c => c + 1)}>{count}</button>;
}

API 라우트와 라우트 처리기 비교

페이지 라우터에서는 pages/api/users.ts가 req/res를 받는 기본 함수를 내보냅니다. 앱 라우터에서는 app/api/users/route.ts가 표준 Request/Response를 사용하는 HTTP 메서드(GET, POST)를 명명된 내보내기로 제공합니다.

// app/api/users/route.ts
export async function GET(request: Request) {
  const users = await db.users.findMany();
  return Response.json(users);
}

export async function POST(request: Request) {
  const body = await request.json();
  const user = await db.users.create({ data: body });
  return Response.json(user, { status: 201 });
}

마이그레이션 전략

두 라우터는 하나의 프로젝트에서 함께 사용할 수 있으므로 페이지를 한 번에 하나씩 점진적으로 이동하면 됩니다. 충돌이 발생하면 앱 라우터가 우선 적용됩니다.

어떤 라우터를 사용할까요

새 프로젝트에는 앱 라우터가 적합합니다. 더 강력하고 현재 투자가 집중되는 방식입니다. 기존 페이지 라우터 프로젝트는 그대로 유지하거나 점진적으로 마이그레이션하십시오. 레이아웃이나 RSC가 필요 없는 작고 정적인 사이트라면 어느 쪽이든 사용할 수 있습니다.

빠른 확인

Next.js 앱 라우터에서 컴포넌트를 클라이언트 컴포넌트로 표시하려면 어떻게 해야 합니까?

복습: 페이지 라우터와 앱 라우터 비교

페이지 라우터: 파일 기반이며 getStaticProps/getServerSideProps를 사용합니다. 앱 라우터(Next 13 이상): 폴더 기반이며 비동기 서버 컴포넌트, 중첩 레이아웃, 로딩/오류 파일을 사용합니다. 'use client'로 클라이언트 상호작용을 표시합니다. API 라우트: pages/api/* 또는 HTTP 메서드를 내보내는 app/api/*/route.ts를 사용합니다. 둘 다 함께 사용할 수 있지만, 앱 라우터가 적극적으로 개발되고 있습니다.

자주 묻는 질문

“Pages Router와 App Router 비교” 강의는 무료인가요?

네 — “Pages Router와 App Router 비교” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Frontend Academy 강의 전체를 잠금 해제할 수 있습니다. Frontend Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“Pages Router와 App Router 비교”에서 뭘 배우나요?

Next.js 라우팅 방식인 file 기반 Pages Router와 중첩 레이아웃, 로딩, 오류 경계를 지원하는 새로운 App Router를 비교합니다. 브라우저에서 직접 실행하는 실습 코드로 Frontend Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Frontend Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Frontend Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“Pages Router와 App Router 비교” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Frontend Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Frontend Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Pages Router와 App Router 비교
  2. 서버 컴포넌트와 클라이언트 컴포넌트
  3. SSG, SSR 및 ISR
  4. Next.js API 경로와 미들웨어
← Frontend Academy(으)로 돌아가기