Next.js의 레이아웃 설정

Frontend/Next.js

페이지 라우터 (Pages Router)

기존 방식에서는 _app.tsx를 통해 전역(Global) 레이아웃을 정의하고,
특정 페이지에서만 별도의 레이아웃을 적용하고 싶을 때는 getLayout 패턴을 사용한다.

.
├── src
│   ├── components
│   │   ├── global-layout.tsx
│   │   └── searchable-layout.tsx
│   ├── pages
│   │   ├── _app.tsx
│   │   ├── book
│   │   │   └── [[...id]].tsx
│   │   ├── search
│   │   │   └── index.tsx

글로벌 레이아웃

// global-layout.tsx

export default function GlobalLayout({ children }: { children: ReactNode }) {
  return (
    <div>
      <header>
        <Link href={"/"}>📚 ONEBITE BOOKS</Link>
      </header>
      <main>{children}</main>
      <footer>제작 @devmark</footer>
    </div>
  );
}
// _app.tsx

import GlobalLayout from "@/components/global-layout";

export default function App({ Component, pageProps }: AppProps) {
  return (
    <GlobalLayout>
      <Component {...pageProps} />
    </GlobalLayout>
  );
}

 

페이지별 레이아웃

// components/searchable-layout.tsx
export default function SearchableLayout({ children }: { children: ReactNode }) {
  return (
    <div>
      <div>검색창</div>
      {children}
    </div>
  );
}
// 레이아웃을 사용할 페이지
import SearchableLayout from "@/components/searchable-layout";

export default function Page() {
  return <h1>Search Page</h1>;
}

// Next.js에게 SearchableLayout를 이 페이지의 레이아웃으로 사용하도록 지시
Page.getLayout = (page: ReactNode) => (
  <SearchableLayout>{page}</SearchableLayout>
);
// _app.tsx

import { NextPage } from "next";

type NextPageWithLayout = NextPage & {
  getLayout?: (page: ReactNode) => ReactNode;
};

export default function App({
  Component,
  pageProps, 
}: AppProps & { Component: NextPageWithLayout }) {
  // 레이아웃 불러오기
  const getLayout = Component.getLayout ?? ((page: ReactNode) => page);

  return (
    <GlobalLayout>
      {/* 레이아웃 적용 */}
      {getLayout(<Component {...pageProps} />)} 
    </GlobalLayout>
  );
}

 

앱 라우터 (App Router)

App Router에서는 layout.tsx파일을 사용하여 특정 경로와 그 하위 경로에 공통적으로 적용될 레이아웃을 정의할 수 있다.

.
├── src
│   └── app
│       ├── search
│       │   ├── layout.tsx // search 하위 경로 레이아웃
│       │   └── page.tsx
│       ├── book
│       │   └── [id]
│       │       └── page.tsx
│       ├── page.tsx
│       └── layout.tsx // 글로벌 레이아웃

 

글로벌 레이아웃

// app/layout.tsx

export default function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode;
}>) {
  return (
    <html lang="ko">
      <body>
        {children}
      </body>
    </html>
  );
}

 

특정 경로 전용 레이아웃

// app/search/layout.tsx
export default function SearchLayout({ children }: { children: React.ReactNode }) {
  return (
    <div>
      <div>임시 서치바</div>
      {children}
    </div>
  );
}

 

Route Groups

Route Groups는 실제 URL 경로에는 영향을 주지 않으면서,
특정 페이지 묶음에 공통 레이아웃을 적용하거나 구조를 논리적으로 정리할 수 있다.

.
├── src
│   └── app
│       ├── (with-searchbar)
│       │   ├── layout.tsx // 경로에 상관없이 (with-searchbar)안에 있는 페이지에 일괄 적용
│       │   ├── page.tsx // '/'
│       │   └── search
│       │       └── page.tsx // '/search'
│       ├── book
│       │   └── [id]
│       │       └── page.tsx
│       └── layout.tsx

'Frontend > Next.js' 카테고리의 다른 글

Next.js 검색 엔진 최적화 (SEO)  (0) 2025.11.13
Next.js 페이지 라우터의 렌더링 방식  (0) 2025.11.13
Next.js의 프리 페칭 (Pre-fetching)  (0) 2025.11.13
Next.js의 네비게이팅  (0) 2025.11.09
Next.js 페이지 라우팅 방식  (0) 2025.11.09
'Frontend/Next.js' 카테고리의 다른 글
  • Next.js 페이지 라우터의 렌더링 방식
  • Next.js의 프리 페칭 (Pre-fetching)
  • Next.js의 네비게이팅
  • Next.js 페이지 라우팅 방식
고견
고견
개발 자국 남기기
  • 고견
    개발자국
    고견
  • 전체
    오늘
    어제
    • 분류 전체보기 (157) N
      • Frontend (29)
        • Next.js (16)
        • JavaScript (7)
      • CS (19) N
        • 자료구조 (9)
        • 알고리즘 (5)
        • 운영체제 (4) N
        • 네트워크 (1) N
      • TIL (93)
      • Dev Log (16)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    문자열
    generic
    앱 라우터
    타입 좁히기
    cs50
    C
    useState
    Trouble Shooting
    javascript
    memory
    알고리즘
    Next.js
    algorithm
    페이지 라우터
    자료구조
    App Router
    배열
    바닐라 자바스크립트
    Pages Router
    인터페이스
    ai 감성 일기장
    emotion diary
    트러블 슈팅
    typescript
    제네릭
    react
    Spa
    함수 타입
    클래스
    CS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
고견
Next.js의 레이아웃 설정
상단으로

티스토리툴바