본문 바로가기
기초다지기/react

[Next.js] 왜 13+부터는 layout.tsx가 필수일까

by 김빵그 2025. 12. 4.

 

오랜만에 Next.js 강의를 다시 듣다가, 예전에는 app/page.tsx 파일에서 단순히 텍스트만 리턴해도 localhost를 열면 그 텍스트가 그대로 화면에 출력됐던 기억이 있었다.

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

 

 

하지만 지금 최신 버전 (Nect.js 16+)에서는 상황이 조금 다르다 

npm run dev 후 페이지를 열어보니 아래와 같은 런타임 에러가 등장한다. 

 

 

즉, 이제는 Root Layout, <html>과 <body> 태그를 포함한 레이아웃 파일이 반드시 필요하다는 뜻이다. 

 

🔗 관련 문서:
Root Layout 문서
https://nextjs.org/docs/app/building-your-application/routing/pages-and-layouts#root-layout-required

 

 

왜 갑자기 레이아웃이 필수가 되었을까?

이 변화는 단순한 문법 변경이 아니라, Next.js 내부 구조가 크게 바뀌면서 생긴 차이다.

Next.js 13+부터 도입된 App Router는 기존에 쓰이던 Pages Router 방식과 완전히 다른 렌더링 구조를 갖는다. 

과거 Pages Router 에서는

  •  페이지는 /pages 폴더에 위치
  • HTML 구조 (<html>, <body>, <head> 등) Next.js가 자동 생성
  • 이후 개발자 단순 페이지 작성하면 됐었음
  • 그래서 page.tsx 에 텍스트만 반환해도 별 문제가 없었다 

 

App Router (13~16)에서는 구조가 완전히 달라짐

App Router는 더 현대적인 React 패턴을 도입하기 위해 만들어짐 

  • React Server Components 기본 적용
  • 중첩 레이아웃 (Nested Layouts) 지원 
  • 페이지 전환 시 레이아웃 유지 > 성능 향상
  • 서버/클라이언트 컴포넌트 명확하게 분리 

 

🔗 관련 문서:
App Router 소개
https://nextjs.org/docs/app
Nested Layouts 개념
https://nextjs.org/docs/app/building-your-application/routing/pages-and-layouts#nested-layouts

 

이런 기능을 가능하게 하려면 앱 전체를 감싸는 루트 HTML 구조가 필요하다. 

app/layout.tsx가 필수인 이유임. 

// app/layout.tsx
export const metadata = {
  title: "My App",
  description: "Generated by Next.js",
};

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