인프런 "한 입 크기로 잘라먹는 Next.js" 수강
먼저 아래 명령어로 새로운 Next.js 프로젝트를 만들어준다.
npx create-next-app@latest section03
설치 중에 나오는 질문 중
Would you like to use App Router?
👉 Yes 를 선택!
App Router를 사용하면, 기존에 있던 pages 폴더가 사라지고 app 폴더 구조로 전환된다.

✅ App Router는 Next.js 13부터 새롭게 도입된 방식으로, 서버 컴포넌트 기반의 훨씬 유연한 구조를 제공한다.
App Router에서 페이지 라우팅은 어떻게 다를까?
기존 Page Router에서는 index.tsx를 만들어 페이지를 구성했지만, 이제는 파일 이름이 page.tsx 로 바뀌었다.
즉, 경로마다 page.tsx 파일을 만들어주면 그게 바로 “페이지”가 된다.
App Router에서는 Query String이나 URL 파라미터 같이 경로 상에 포함되는 값은
page.tsx컴포넌트의props로 전달된다는 것을 기억하며 살펴보자!
예전처럼 [id].tsx 파일을 만들지 않고, 이제는 [id]라는 폴더를 생성한 후, 그 안에 page.tsx를 만들어야 한다.

export default function Page() {
return <div>book/[id] page 입니다</div>;
}
실행하면 아래와 같은 결과를 확인할 수 있다.

URL 파라미터 값을 꺼내서 사용해보자!
export default async function Page({ params }: { params: { id: string } }) {
const { id } = params;
return <div>book/[id] page: {id}</div>;
}

✅ 정리하며
params는 URL 경로의 파라미터 값을 Promise 형태로 전달해준다.- 세그먼트(
...id)도 동일하게 사용할 수 있지만, 경로가 없을 수도 있다면[[...id]]로 설정해주는 게 안전하다.
props를 콘솔로 출력해보면, params: Promise {...}, searchParams: Promise {...} 의 객체 형태의 값을 확인할 수 있다.
export default async function Page({ searchParams }: { searchParams: { q: string } }) {
const { q } = searchParams;
return <div>검색 페이지: {q}</div>;
}

참고로 함수형 컴포넌트에 async를 붙일 수 있는 이유는, App Router의 컴포넌트가 서버 컴포넌트(Server Component) 로 동작하기 때문!
App Router는 페이지마다 반복되는 UI를 효율적으로 관리할 수 있다.
특정 경로에 공통된 UI를 적용하려면, 해당 폴더에 layout.tsx 파일을 추가하면 된다.
export default function Layuout({ children }: { children: React.ReactNode }) {
return (
<div>
<div>임시 서치바</div>
{children}
</div>
);
}
layout.tsx→page.tsx순으로 실행되며, 하위 경로에도 자동으로 적용됨.
하위 폴더(setting)에도 layout.tsx를 추가하면, 두 개의 레이아웃이 중첩 적용된다.
export default function Page() {
return <div>search/setting</div>;
}
export default function Layout({ children }: { children: React.ReactNode }) {
return (
<div>
<div>세팅 헤더</div>
{children}
</div>
);
}

중첩 레이아웃까지 적용된 것을 확인할 수 있다.
- ⚠️ 루트의
layout.tsx는 절대 삭제하면 안 된다.(앱 전체의 기본 구조를 담당)
이번엔 서로 다른 경로지만 공통 레이아웃을 적용하고 싶을 때!
이럴 땐 Route Group 기능을 사용한다.
(폴더명)형태로 작성하면, 해당 폴더는 실제 URL 경로에는 포함되지 않음 👇
- 경로에 영향을 주지 않기 떄문에 경로가 정상적으로 작동한다.
- 공통 레이아웃이 필요한 페이지들을 생성한 폴더에 넣은 후, 레이아웃을 설정할 수 있다.
실행 후 확인해보자! 👇


경로가 달라도 공통 레이아웃이 잘 적용됨! (Route Group 덕분에 경로는 깔끔하게, 구조는 유연하게 유지~)
page.tsx와 layout.tsx로 구성params, 쿼리 스트링은 searchParams로 접근