Web 프로그래밍/Typescript
shadcn 프레임워크를 이용한 react next js 전체적인 폴더구조
데브업
2025. 4. 20. 01:13
Next.js (App Router)에서 app/page.tsx는 루트 URL(/)에 해당하는 페이지입니다.
이 페이지에서 별도의 설정 없이도 app/layout.tsx에 정의된 Header, Footer, 그리고 ThemeProvider 등은 자동으로 적용됩니다.
즉, layout.tsx는 상위 루트 레이아웃이고, page.tsx는 그 안에 children으로 포함되므로, page.tsx는 오직 메인 콘텐츠만 넣어주면 됩니다.
✅ 최종 동작 흐름
layout.tsx
└── <Header />
└── <main>{children}</main> ← 여기로 page.tsx의 컴포넌트가 렌더링됨
└── <Footer />
✅ app/page.tsx 예시 (레이아웃 자동 포함됨)
import Container from '@/components/layout/Container'
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
export default function HomePage() {
return (
<Container>
<Card>
<CardHeader>
<CardTitle>Welcome to MyApp</CardTitle>
</CardHeader>
<CardContent>
<p>This is the home page using shadcn/ui and Next.js App Router.</p>
</CardContent>
</Card>
</Container>
)
}
✅ 위 파일만으로도 layout.tsx의 Header/Footer 포함된 전체 페이지가 자동으로 구성됩니다.
❗️주의사항 (레이아웃 적용 안 될 수 있는 경우)
- layout.tsx가 존재하지 않거나 children을 렌더링하지 않는 경우
- app/page.tsx가 Client Component인데, layout.tsx는 Server Component일 때 hydration mismatch
- 폴더가 app이 아니라 pages 디렉터리 구조를 사용하는 경우
✅ 테스트 방법
- Header, Footer에 console.log("Header loaded") 같은 로그 넣기
- 브라우저에서 / 접속
- 로그가 정상 출력되면 layout.tsx → page.tsx 연결 완료
원한다면 /about, /contact 등도 라우트 구조로 만들어서 같은 레이아웃을 공유하도록 확장할 수 있어요. 원리도 동일합니다:
app/
├── layout.tsx
├── page.tsx
├── about/
│ └── page.tsx
├── contact/
│ └── page.tsx
각 page.tsx는 레이아웃의 children 자리에 자동 삽입됩니다.
필요하시면 layout.tsx에 서브 레이아웃 구분, 다크모드 토글, 모바일 대응 등까지도 확장해서 도와드릴게요.