Next.js 13부터 도입된 App Router는 기존의 Page Router를 완전히 대체하는 디렉터리 기반 라우팅(Directory-based Routing) 방식의 라우터이다.
이를 통해 서버 컴포넌트와 클라이언트 컴포넌트를 효율적으로 조합할 수 있으며, 성능 최적화와 개발 경험 향상에 기여한다.
폴더 구조를 기반으로 페이지 라우팅이 자동 설정된다는 점은 Page Router와 동일하지만
App Router에서는 page라는 이름을 갖는 파일만 페이지로 설정된다.


Next.js의 서버 컴포넌트(page.tsx)는 클라이언트 컴포넌트와 다르게 클라이언트에서 직접 props를 전달할 수 없고, Next.js가 자동으로 props를 제공하는 구조다.
(Next.js 15부터 Promise로 변경됨)(Next.js 15부터 Promise로 변경됨)// app/search/page.tsx
export default async function Page({
searchParams,
}: {
searchParams: Promise<{ q: string }>;
}) {
const { q } = await searchParams;
return <div>Search 페이지 : {q}</div>;
}
// app/book/[id]/page.tsx
export default async function Page({
params,
}: {
params: Promise<{ id: number }>;
}) {
const { id } = await params;
return <div>book/[id]페이지 : {id}</div>;
}
Catch-all Segments, Optional Catch-all Segments는 pages router를 사용할 때와 유사한 방식으로
[id]라는 폴더명을 [...id], [[...id]]로 바꿔주면 된다.
(pages router에서는 파일명을 [...id].tsx, [[...id]].tsx로 변경)
RootLayout은 Next.js App Router에서 전체 페이지에 공통으로 적용되는 레이아웃을 정의하는 파일이다.
이 파일은 반드시 app/layout.tsx 경로에 존재해야 하며, Next.js는 이를 최상위(루트) 레이아웃으로 자동 인식한다.
// app/layout.tsx
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="ko">
<body>
<nav>네비게이션 바</nav>
{children} {/* 각 페이지의 콘텐츠가 여기에 렌더링됨 */}
</body>
</html>
);
}
RootLayout의 역할
<html>, <body> 태그를 정의하는 역할<head> 태그 설정 가능 (metadata API 활용)page라는 이름을 가진 파일이 자동으로 페이지 역할을 하는 파일로 설정되듯이
layout이라는 파일을 생성하면 해당 경로의 layout 역할을 하는 파일로 자동 설정된다.
예를 들어, search라는 경로(폴더)를 만들고 해당 경로에 적용할 layout.tsx파일을 만들면 이 레이아웃은 search로 시작하는 모든 페이지에 적용되고 하위로 page.tsx로 만들어진 children이 렌더링 된다.


공통된 경로가 아닌 페이지에 레이아웃 적용하려면 라우트 그룹 (Route Groups)을 사용하면 된다.
폴더 이름을 ()중괄호로 감싼 채로 만들게 되면 자동으로 라우트 그룹으로 적용되어 경로상에는 아무런 영향을 미치지 않은 채 페이지들을 그룹화하여 공통 레이아웃을 적용할 수 있게 된다.
