본문 바로가기
C.W.K.
Stream
Lesson 01 of 10 · published

폴더가 주소가 되는 규칙

~20 min · routing, file system, page.tsx

Level 0호기심
0 XP0/68 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

app/의 폴더가 주소를 만든다

App Router에서는 폴더 하나가 URL의 한 구간을 나타내. 다만 폴더만 만든다고 외부에 주소가 생기지는 않아. 그 안에 page.tsx가 있어야 비로소 방문할 수 있는 라우트가 돼. 그래서 app/blog/[slug]/page.tsx/blog/:slug에 대응하고, 폴더를 중첩한 깊이가 그대로 주소의 깊이가 돼.

파일주소
app/page.tsx/
app/about/page.tsx/about
app/blog/page.tsx/blog
app/blog/[slug]/page.tsx/blog/:slug
app/dashboard/settings/page.tsx/dashboard/settings

공개 여부를 결정하는 파일은 page.tsx

같은 폴더에 도우미 함수나 작은 컴포넌트를 함께 둬도 그 파일들이 별도 URL로 노출되지는 않아. 프레임워크는 필요한 모듈을 불러오지만, page.tsx가 없는 폴더는 공개 라우트로 취급하지 않거든. 관련 코드를 화면 가까이에 놓으면서도 주소 체계를 흐리지 않을 수 있는 이유야.

특수 파일은 라우트의 행동을 나눠 맡아

파일맡는 일
page.tsx해당 구간의 화면을 공개해.
layout.tsx하위 화면을 감싸고 이동 뒤에도 유지돼.
loading.tsx해당 구간의 Suspense 대체 화면이 돼.
error.tsx오류 경계를 만들며 클라이언트 컴포넌트여야 해.
not-found.tsxnotFound()가 실행됐을 때 보일 화면이야.
template.tsx레이아웃과 비슷하지만 이동할 때마다 새로 마운트돼.
default.tsx직접 방문한 병렬 라우트 슬롯의 대체 화면이야.
route.tsHTTP 엔드포인트를 만들며 같은 폴더의 page.tsx와 공존할 수 없어.

새 URL을 만들 때 먼저 공개 주소를 적고, 그다음 같은 모양의 폴더 트리를 만들어. 화면과 가까운 도우미는 그 폴더에 함께 두되 page.tsx만 공개 경계를 연다는 규칙을 유지해. 코드 조직용 폴더와 주소용 폴더가 헷갈리면 괄호 라우트 그룹을 써서 의도를 드러내. 파일 기반 라우팅이 설계를 대신해 주지는 않아. 폴더를 깊게 나누기 쉽다는 이유로 제품의 정보 구조까지 깊게 만들면 사용자가 긴 URL과 복잡한 내비게이션을 떠안아. 먼저 사람이 이해할 주소 체계를 정하고 파일 트리가 그 결과를 상속하게 해야 해.

예상 URL 목록과 실제 빌드 라우트 목록을 비교하고, 공개할 생각이 없는 같은 위치의 파일을 주소로 직접 요청해 봐. page.tsxroute.ts를 같은 구간에 두었을 때 빌드가 어떻게 거부하는지도 확인하면 파일 관례가 단순 이름 규칙이 아니라 충돌 방지 계약임을 알 수 있어.

Code

최소 페이지·tsx
// app/about/page.tsx → /about
export default function AboutPage() {
  return (
    <main className="prose mx-auto p-8">
      <h1>소개</h1>
      <p>기본값: 서버 렌더링</p>
    </main>
  );
}
함께 둔 컴포넌트는 라우트가 되지 않아·text
app/blog/
├── page.tsx               → /blog (공개)
├── PostCard.tsx           → 라우트 아님, 같은 위치의 파일일 뿐
├── useFilters.ts          → 라우트 아님
└── [slug]/
    ├── page.tsx           → /blog/:slug (공개)
    └── ShareButton.tsx    → 라우트 아님

External links

Exercise

/, /about, /blog, /blog/[slug], /contact 다섯 라우트를 만들어. /blog 전용 카드 컴포넌트를 같은 폴더에 두고 그 파일 자체는 공개 URL이 되지 않는지 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.