기본 디렉토리 구조
app/
├── layout.tsx # 전체 앱 공통 레이아웃
├── page.tsx # 루트 페이지 (/)
└── dashboard/
├── layout.tsx # /dashboard 하위 전용 레이아웃
├── page.tsx # /dashboard 페이지
└── settings/
└── page.tsx # /dashboard/settings 페이지
layout.tsx
layout.tsx는 특정 경로 이하의 모든 하위 페이지에 적용되는 공통 레이아웃 구성 파일입니다.
예를 들어 app/dashboard/layout.tsx는 /dashboard, /dashboard/settings, /dashboard/profile 등 하위 모든 경로에 공통 UI(예: 사이드바, 헤더)를 제공합니다.
예시 코드
// 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: 현재 경로에 해당하는 페이지 콘텐츠가 여기에 들어갑니다.
- layout.tsx는 틀(프레임)이고, children은 그 안에 들어가는 내용입니다.
children
React에서 children은 컴포넌트 내부에 렌더링될 자식 요소를 의미합니다.
예시
// layout.tsx 내부
<div>
<h1>공통 레이아웃</h1>
{children} // 여기에 각 페이지의 콘텐츠가 들어감
</div>
// page.tsx
export default function Page() {
return <p>대시보드 메인 콘텐츠입니다</p>;
}
렌더링 결과
공통 레이아웃
대시보드 메인 콘텐츠입니다
하위 경로로 들어가면?
예를 들어 /dashboard/settings로 이동하면
- Next.js는 먼저 app/dashboard/layout.tsx를 렌더링합니다.
- 그 안의 {children} 자리에 app/dashboard/settings/page.tsx의 내용이 들어갑니다.
- SideNav는 그대로 유지되고, 오른쪽 내용만 바뀝니다.
실제 동작 흐름
// layout.tsx
<SideNav />
{children} // <- 여기 자리에 settings/page.tsx의 내용이 들어옴
// settings/page.tsx
export default function SettingsPage() {
return <p>설정 페이지입니다</p>;
}
결과 화면
[SideNav 고정됨] 설정 페이지입니다
중첩 레이아웃이 필요한 경우는?
/dashboard/settings만 다른 레이아웃을 쓰고 싶다면 app/dashboard/settings/layout.tsx를 새로 만들면 됩니다.
Next.js는 해당 경로의 layout.tsx를 우선적으로 적용합니다.
정리
| 항목 | 설명 |
| layout.tsx | 공통 레이아웃 정의, 반복되는 UI를 재사용 가능 |
| children | 해당 경로의 page.tsx 내용이 렌더링되는 자리 |
| 장점 | 레이아웃 유지 + 페이지 전환만 수행 = 빠르고 일관된 UX |
| 중첩 가능 | /dashboard, /dashboard/settings 등 레이아웃 구분 가능 |
'개발 공부 > React' 카테고리의 다른 글
| TanStack Query (0) | 2025.05.22 |
|---|---|
| Next.js - 동적 라우팅 (0) | 2025.05.14 |
| Next.js- cookies().get(), middleware 로그인 유지 (0) | 2025.05.09 |
| Next.js, Redux - 로그인/로그아웃 (0) | 2025.05.06 |
| Redux login 예시 (0) | 2025.05.05 |