Next.js는 폴더 구조를 통해 중첩된 경로를 자동으로 생성하는 혁신적인 라우팅 시스템을 제공합니다.
핵심 개념:

page.tsx - 페이지 컴포넌트/app/page.tsx → 루트 경로 /의 홈페이지layout.tsx - 레이아웃 컴포넌트// /app/dashboard/page.tsx
export default function Page() {
return <p>Dashboard Page</p>;
}
결과 확인:
http://localhost:3000/dashboard 접속

대시보드의 여러 페이지에서 공통으로 사용되는 내비게이션이 필요합니다. Next.js에서는 layout.tsx 파일을 통해 이를 효율적으로 구현할 수 있습니다.
// /app/dashboard/layout.tsx
import SideNav from "@/app/ui/dashboard/sidenav";
export default function Layout({ children }: { children: React.ReactNode }) {
return (
<div className="flex h-screen flex-col md:flex-row md:overflow-hidden">
<div className="w-full flex-none md:w-64">
<SideNav />
</div>
<div className="flex-grow p-6 md:overflow-y-auto md:p-12">
{children}
</div>
</div>
);
}
<SideNav /> 컴포넌트children Props/dashboard 내의 모든 페이지가 자동으로 이 레이아웃 안에 중첩됨
Module not found: Can't resolve '@/app/ui/fonts'
1단계: /app/ui/fonts.ts에 Lusitana 폰트 추가
// /app/ui/fonts.ts
// ...기존 코드
export const lusitana = Lusitana({
weight: ["400", "700"],
subsets: ["latin"],
});
2단계: /app/ui/acme-logo.tsx에서 폰트 import
// /app/ui/acme-logo.tsx
import { lusitana } from "@/app/ui/fonts";
이전 Chapter 3에서 /app/layout.tsx에 Inter 폰트를 적용했습니다. 이로 인해 모든 하위 페이지에서 자동으로 Inter 폰트를 사용할 수 있게 되었습니다.
루트 레이아웃은 Next.js 프로젝트의 최상단(/app)에 위치하여 모든 하위 페이지에 공통 UI를 적용하는 필수 레이아웃입니다.
// /app/layout.tsx
import "@/app/ui/global.css";
import { inter } from "@/app/ui/fonts";
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en">
<body className={`${inter.className} antialiased`}>
{children}
</body>
</html>
);
}
<html> 및 <body> 태그 수정/app/layout.tsx): 전체 애플리케이션에 적용/app/dashboard/layout.tsx): /dashboard 하위 경로에만 적용| 레이아웃 파일 | 적용 범위 | 역할 |
|---|---|---|
/app/layout.tsx | 전체 애플리케이션 | 전역 설정, 공통 스타일 |
/app/dashboard/layout.tsx | /dashboard/* | 대시보드 공통 UI |
루트 레이아웃은 전역 설정을 담당하므로, 대시보드 전용 UI는 별도의 레이아웃에서 관리하는 것이 적절합니다.