태그
목차

라우팅 기초

생성일: 2024-02-01

수정일: 2024-02-01

모든 애플리케이션의 뼈대는 라우팅이다. 이 페이지에서는 웹 라우팅의 기본 개념과 Next.js에서 라우팅을 처리하는 방법을 소개한다.

용어

먼저, 문서 전체에서 다음과 같은 용어가 사용되는 것을 볼 수 있다. 다음은 간단한 참조다:

용어 설명
트리(Tree) 계층 구조를 시각화하기 위한 컨벤션이다. 예를 들어 부모 컴포넌트와 자식 컴포넌트가 있는 컴포넌트 트리, 폴더 구조 등을 말한다.
서브트리(Subtree) 새 루트(첫 번째)에서 시작하여 리프(마지막)로 끝나는 트리의 한 부분을 말한다.
루트(Root) 루트 레이아웃과 같은 트리 또는 서브트리의 첫 번째 노드를 말한다.
리프(Leaf) URL 경로의 마지막 세그먼트와 같이 서브트리의 자식이 없는 노드를 말한다.
용어 설명
URL 세그먼트(Segment) 슬래시( / )로 구분된 URL 경로의 한 부분을 말한다.
URL 경로(Path) 도메인(Domain) 뒤에 오는 URL의 부분(세그먼트로 구성)을 말한다.

app 라우터

버전 13에서는 공유 레이아웃, 중첩 라우팅, 로딩 상태, 오류 처리 등을 지원하는 React 서버 컴포넌트에 기반한 새로운 앱 라우터가 도입되었다.

앱 라우터는 app 이라는 새 디렉토리에서 작동한다. app 디렉토리는 pages 디렉터리와 함께 작동하여 점진적으로 적용할 수 있다. 따라서 애플리케이션의 일부 경로를 새로운 동작으로 선택하면서 다른 경로는 이전 동작을 위해 pages 디렉토리로 유지할 수 있다. 애플리케이션에서 pages 디렉토리를 사용하는 경우 페이지 라우터 문서를 참조하면 된다.

Tip

앱 라우터는 페이지 라우터보다 우선한다. 디렉터리 간 라우트는 동일한 URL 경로가 있으면 안 되며 충돌을 방지하기 위해 빌드 타임 오류가 발생한다.

기본적으로 app 내부의 컴포넌트는 React 서버 컴포넌트다. 이는 성능 최적화를 위한 것으로 쉽게 적용할 수 있으며, 클라이언트 컴포넌트를 사용할 수도 있다.

폴더와 파일의 역할

Next.js는 파일 시스템 기반 라우터를 사용한다:

라우트 세그먼트

라우트에서 각 폴더는 라우트 세그먼트를 나타낸다. 각 라우트 세그먼트는 URL 경로의 해당 세그먼트에 매핑된다.

중첩 라우트

중첩된 라우트를 만들려면 폴더를 중첩하면 된다. 예를 들어, app 디렉토리에 두 개의 새 폴더를 중첩하여 새로운 /dashboard/settings 라우트를 만들 수 있다.

/dashboard/settings 라우트는 세 개의 세그먼트로 구성된다:

파일 컨벤션

Next.js는 중첩된 라우트에서 특정 동작을 하는 UI를 만들기 위한 특수 파일 세트를 제공한다:

파일 설명
layout 세그먼트 및 해당 하위 세그먼트의 공유 레이아웃 UI
page 공개적으로 액세스할 수 있는 페이지 UI
loading 세그먼트와 하위 세그먼트를 위한 로딩 UI
not-found 세그먼트와 하위 세그먼트를 위한 Not found UI
error 세그먼트와 하위 세그먼트를 위한 에러 UI
global-error 전역 에러 UI
route 서버 사이드 API 엔드포인트
template 재사용되는 레이아웃 UI
default 병렬 라우트를 위한 폴백 UI

Note

위의 파일들은 .js , .jsx 또는 .tsx 확장자만 사용가능하다.

컴포넌트 계층

라우트 세그먼트의 특수 파일에 정의된 React 컴포넌트는 특정 계층 구조로 렌더링된다:

중첩된 라우트에서 세그먼트의 컴포넌트는 상위 세그먼트의 컴포넌트 안에 중첩된다.

코로케이션

특수 파일 외에도 컴포넌트, 스타일, 테스트 등 고유한 파일을 app 디렉터리의 폴더에 배치할 수 있다.

폴더는 라우트를 정의하지만 page.js 또는 route.js 가 반환하는 콘텐츠만 공개적으로 주소 지정이 가능하기 때문이다.

고급 라우팅 패턴

또한 앱 라우터는 고급 라우팅 패턴을 구현하는 데 도움이 되는 일련의 규칙을 제공한다. 여기에는 다음이 포함된다:

이러한 패턴을 사용하면 더 풍부하고 복잡한 UI를 구축할 수 있으므로 소규모 팀이나 개별 개발자가 구현하기에는 복잡했던 기능을 대중화할 수 있다.