C.W.K.
Stream
Lesson 04 of 08 · published

App Router vs Pages Router

~22 min · App Router, Pages Router, migration

Level 0Curious
0 XP0/68 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

두 router, 한 repo — 일단은

Next.js 는 아직 두 router 다 지원해. Legacy app 들이 다 이사 안 했거든. 새 작업은 App Router (app/ 디렉토리) 로 가. Pages Router (pages/) 는 migration 용이고 새 feature 안 들어와.

능력Pages RouterApp Router
Directorypages/app/
Default renderClientServer
Data fetchinggetServerSideProps / getStaticPropsasync component, 직접 fetch
Layout_app.tsx 수동 wrapsegment 마다 layout.tsx
Loading UI수동loading.tsx + Suspense
Error UI_error.tsxerror.tsx + global-error.tsx
Streaming제한적일등 시민
Server Action없음있음

Mental model 의 이동

Pages Router 는 data fetching function 따로 있는 page 로 생각하고, App Router 는 route segment 로 묶이는 composable Server & Client Component 로 생각해. "Next.js 가 이상해진 것 같아" 반응 대부분이 syntax 가 아니라 이 mental shift 때문이야.

같은 project 안 공존

Segment 단위로 동시 작동. 같은 path 가 app/pages/ 둘 다 있으면 App Router 가 이김. Big-bang rewrite 안 해도 돼 — route 단위로 옮겨.

Code

Pages Router — data 가 따로·tsx
// pages/blog/[slug].tsx
export async function getServerSideProps({ params }) {
  const post = await fetchPost(params.slug);
  return { props: { post } };
}

export default function BlogPost({ post }) {
  return <article>{post.content}</article>;
}
App Router — fetch 가 component 안에·tsx
// app/blog/[slug]/page.tsx
export default async function BlogPost({
  params,
}: {
  params: Promise<{ slug: string }>;
}) {
  const { slug } = await params; // v15+: params 가 Promise
  const post = await fetchPost(slug);
  return <article>{post.content}</article>;
}

External links

Exercise

Pages Router route 하나 골라서 App Router 로 다시 써. 두 버전 나란히 보여주고, 뭐가 공짜로 생겼는지 (loading, error, streaming) + 뭐가 자리 옮겼는지 (data fetching) 짚어봐.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.