Next.js에서는 폴더를 사용하여 중첩된 route(경로)를 만든다.
layout.tsx
, page.tsx
파일을 사용하여, 경로 별 별도의 공통 UI 및 페이지 만들 수 있다.
page.tsx
파일은 특별한 Next.js의 파일이다. React 컴포넌트를 내보내기(export)하며, 경로에 access하기 위해 꼭 필요하다./app/page.tsx
는 루트의 /
위치와 관련된 가장 최상단의 홈 페이지이다.
app
디렉터리 하위에 dashboard (/app/dashboard)
디렉터리를 생성한 후, 그 내부에 page.tsx
를 생성한 다음, 아래와 같은 내용을 작성해보자.export default function Page() {
return <p>Dashboard Page</p>;
}
대시보드에는 여러 페이지에서 공유되는 일종의 내비게이션이 있다. 만약 Next.js에서 여러 페이지들이 공유해야하는 UI를 만들어야 한다면,layout.tsx
이라는 특수한 파일을 생성하여 사용할 수 있다.
대시보드 페이지를 위한 레이아웃을 만들기 위해 /dashboard
디렉터리 안에 layout.tsx
이라는 파일을 생성한 후, 아래 코드를 작성해보자.
아래 코드는, <SideNav />
컴포넌트를 레이아웃에 가져오고 있다. 이런 식으로, 해당 파일에 가져온 모든 컴포넌트는 레이아웃의 일부가 된다.
또한, <Layout />
컴포넌트는 children
이라는 props
를 받는다. 이것은 하위 페이지이거나, 또다른 레이아웃일 수 있다.
/dashboard
내의 페이지가 자동으로 <Layout />
내에 중첩될 것이다.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>
);
}
Module not found: Can't resolve '@/app/ui/fonts'
라는 오류가 발생한다면, /app/ui/font.ts
에 아래 코드를 추가로 작성해야 한다.// ...이전코드
export const lusitana = Lusitana({
weight: ["400", "700"],
subsets: ["latin"],
});
/app/ui/acme-logo.tsx
에서 해당 lusitana
폰트 데이터를 불러와야 한다.
/app/layout.tsx
에 Inter
폰트를 가져온 적이 있다.Inter
폰트를 사용할 수 있다./app
)하여, 모든 하위 페이지에 공통의 UI를 적용할 수 있도록 필수적으로 구현해야 하는 레이아웃(/app/layout.tsx
)을 루트 레이아웃이라고 부른다.import "@/app/ui/global.css";
import { inter, lusitana } from "@/app/ui/font";
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en">
{/* 여기! */}
<body className={`${inter.className} antialiased`}>{children}</body>
</html>
);
}
<html>
및 <body>
태그를 수정하고 메타데이터를 추가할 수 있다.(/app/dashboard/layout.tsx)
은 대시보드 페이지가 존재하는 하위 경로(/app/dashboard/...)
의 페이지에만 적용되기 때문에, 최상단 레이아웃인 루트 레이아웃에는 어떤 UI도 추가할 필요가 없다.