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

App Router 가 이기는 이유

~22 min · RSC, streaming, Suspense

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

새 폴더가 아니라 새 architecture

App Router 는 React Server Component, Suspense, streaming HTTP response model 위에 지어진 거야. 이 셋 다 Pages Router 시절엔 없었어. 실제로 얻는 5 가지:

  1. Default 가 Server Component. Component 가 server 에서 render 되고, 그 노드는 JS 0 byte 야. 무거운 library (markdown, syntax highlight, date formatter) 가 server 에 머물러.
  2. Nested layout 이 살아남음. Dashboard 안에서 tab 클릭해도 dashboard shell 은 re-render 안 해. State 와 DOM 이 navigation 너머로 살아 있어.
  3. Streaming & Suspense. Page 가 HTML 을 조각으로 보내. 싼 부분 즉시 도착, 느린 data 는 stream. 전체 spinner 없음.
  4. Parallel route. 한 layout 안에 여러 route segment 가 동시에 그려져, 각각 자기 loading/error boundary 들고.
  5. Server Action. Mutation 이 server 에 살고 form 에서 직접 호출. CRUD 마다 /api/… route table 만들 필요 없음.

팀한테 바뀌는 것

모든 server 작업마다 API route 안 짜게 돼. Navigation 마다 다시 fetch 하는 client-side data library 로 page wrap 안 해. Server-default leaf 를 base 로 짜고 진짜 interactivity 가 사는 leaf 에만 'use client' 박는 식이야.

Code

Child navigation 너머로 살아남는 nested layout·tsx
// app/dashboard/layout.tsx
export default function DashboardLayout({
  children,
  analytics,
}: {
  children: React.ReactNode;
  analytics: React.ReactNode; // parallel slot @analytics
}) {
  return (
    <div className="grid grid-cols-[240px_1fr_320px]">
      <Sidebar />
      <main>{children}</main>
      <aside>{analytics}</aside>
    </div>
  );
}

// app/dashboard/loading.tsx
export default function Loading() {
  return <DashboardSkeleton />;
}
명시적 Suspense island 로 streaming·tsx
import { Suspense } from 'react';

export default function Page() {
  return (
    <>
      <Header /> {/* 빠름, server-rendered */}
      <Suspense fallback={<StatsSkeleton />}>
        <Stats />        {/* 느린 query, stream */}
      </Suspense>
      <Suspense fallback={<ChartSkeleton />}>
        <RevenueChart /> {/* 독립 stream */}
      </Suspense>
    </>
  );
}

External links

Exercise

App 안에서 data fetch 가 느린 route 골라. loading.tsx 추가하고 느린 leaf 주변에 Suspense 둘러봐. Before/after 체감 load 캡처.

Progress

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

댓글 0

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

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