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 디렉터리 구조를 사용하는 경우

✅ 테스트 방법

  1. Header, Footer에 console.log("Header loaded") 같은 로그 넣기
  2. 브라우저에서 / 접속
  3. 로그가 정상 출력되면 layout.tsx → page.tsx 연결 완료

원한다면 /about, /contact 등도 라우트 구조로 만들어서 같은 레이아웃을 공유하도록 확장할 수 있어요. 원리도 동일합니다:

app/
├── layout.tsx
├── page.tsx
├── about/
│   └── page.tsx
├── contact/
│   └── page.tsx

각 page.tsx는 레이아웃의 children 자리에 자동 삽입됩니다.


필요하시면 layout.tsx에 서브 레이아웃 구분, 다크모드 토글, 모바일 대응 등까지도 확장해서 도와드릴게요.