frontEnd/nextjs

[Next.JS] Route Groups, Merging Layouts

Ama_grammer 2025. 4. 22. 16:31

 

- 목차 

  1. route groups 란?
  2. 왜 필요할까?
  3. 예제
  4. route groups 와 layout 병합
  5. 레이아웃 병합이란?
  6. 병합 순서
  7. 예제
  8. 정리

📝  Route Groups

Next.js 13부터 도입된 App Router는 파일 기반 라우팅을 더 유연하고 강력하게 만들어준다.

그중에서도 Route Groups는 프로젝트 구조는 깔끔하게 유지하면서도 URL 구조에 영향을 주지 않도록 해주는 아주 유용한 기능이다.


📌 Route Groups란?

Route Groups URL 경로에는 포함되지 않지만, 폴더 구조를 논리적으로 그룹화(logical groups) 할 수 있도록 해주는 기능이다. Next.js에서는 폴더 이름을 () 괄호로 감싸면 해당 폴더는 URL 경로에 포함되지 않는다.

📂 예: (auth)
이 폴더는 실제 URL로 생성되지 않는다.

왜 필요할까

예를 들어, 로그인과 회원가입 페이지에만 로그인 전용 레이아웃을 적용하고 싶다고 한다면, 이걸 구조적으로 구분하고 싶지만, /auth/login 같은 URL 대신 /login, /signup 형태를 유지하고 싶다면 Route Groups가 유용하게 쓰인다.

로그인/회원가입 전용 레이아웃 적용.

📁 디렉토리 구조

app/
├─ (auth)/
│  ├─ layout.tsx      // 로그인 전용 레이아웃
│  ├─ login/
│  │  └─ page.tsx
│  └─ signup/
│     └─ page.tsx
├─ dashboard/
│  └─ page.tsx
└─ layout.tsx         // 전체 앱 기본 레이아웃

URL

  • /login → app/(auth)/login/page.tsx
  • /signup → app/(auth)/signup/page.tsx
  • /dashboard → app/dashboard/page.tsx

(auth) 폴더는 실제 URL에 포함되지 않고, 내부에 있는 페이지들은 /login, /signup 같은 경로를 그대로 유지할 수 있다.

layout.tsx 예시.

// app/(auth)/layout.tsx
export default function AuthLayout({ children }) {
  return (
    <div className="auth-layout">
      <header>로그인 헤더</header>
      <main>{children}</main>
    </div>
  );
}

📝 Route Groups와 Layout 병합 (Merging Layouts)

Next.js App Router에서는 레이아웃이 병합(Merge)된다는 개념도 중요하다. Route Groups와 함께 사용할 때 이 구조를 잘 이해하면 페이지마다 다른 UI를 구성하면서도 전체 구조는 일관되게 유지할 수 있다.

📌 레이아웃 병합이란?

App Router에서는 여러 단계의 layout.tsx가 존재할 수 있고, Next.js는 각 레벨의 레이아웃을 병합하여 최종 페이지를 렌더링한다.

app/
├─ layout.tsx          // 전체 앱 공통 레이아웃
├─ (auth)/
│  ├─ layout.tsx       // 로그인 전용 레이아웃
│  └─ login/page.tsx

병합 순서

  1. app/layout.tsx → 앱 전체 공통 레이아웃
  2. app/(auth)/layout.tsx → 로그인 전용 레이아웃
  3. app/(auth)/login/page.tsx → 페이지 컴포넌트

이 구조로 렌더링될 경우, 로그인 페이지는 공통 레이아웃 + 로그인 전용 레이아웃 + 페이지 본문이 모두 병합된다.

코드 예시.

// app/layout.tsx
export default function RootLayout({ children }) {
  return (
    <html>
      <body>
        <div className="global-wrapper">{children}</div>
      </body>
    </html>
  );
}
// app/(auth)/layout.tsx
export default function AuthLayout({ children }) {
  return (
    <div className="auth-layout">
      <header>Auth 전용 헤더</header>
      <main>{children}</main>
    </div>
  );
}
// app/(auth)/login/page.tsx
export default function LoginPage() {
  return <div>로그인 폼</div>;
}

📄 실제 렌더링 구조

<html>
  <body>
    <div class="global-wrapper">
      <div class="auth-layout">
        <header>Auth 전용 헤더</header>
        <main>
          <div>로그인 폼</div>
        </main>
      </div>
    </div>
  </body>
</html>

정리

  • layout.tsx는 계층적으로 병합된다.
  • Route Groups 내부에 있는 layout도 병합 대상이다.
  • 이 구조를 활용하면 페이지마다 다른 UI 구조를 만들 수 있다.
💡 Route Groups + Layout 병합 = 구조는 깔끔, UI는 유연

 

- 참고

https://nextjs.org/docs/app/building-your-application/routing/route-groups

 

Routing: Route Groups | Next.js

Route Groups can be used to partition your Next.js application into different sections.

nextjs.org