본문으로 건너뛰기

라우터 만들기

createRouter 함수

라우터를 사용할 준비가 되면 새 Router 인스턴스를 만들어야 합니다. 라우터 인스턴스는 TanStack Router의 핵심으로, 라우트 트리 관리, 라우트 매칭, 내비게이션 및 라우트 전환 조정을 담당합니다. 또한 라우터 전체 설정을 구성하는 곳이기도 합니다.

React

src/router.tsx
import { createRouter } from '@tanstack/react-router'

const router = createRouter({
// ...
})

Solid

src/router.tsx
import { createRouter } from '@tanstack/solid-router'

const router = createRouter({
// ...
})

라우트 트리

Router 생성자에는 routeTree 옵션이 필요하다는 사실을 곧 알게 될 것입니다. 이 라우트 트리를 사용해 라우터가 라우트를 매칭하고 컴포넌트를 렌더링합니다.

파일 기반 라우팅 또는 코드 기반 라우팅을 사용했다면 라우트 트리를 createRouter 함수에 전달해야 합니다.

파일 시스템 라우트 트리

권장하는 파일 기반 라우팅을 사용했다면 생성된 라우트 트리 파일이 기본 위치인 src/routeTree.gen.ts에 만들어졌을 가능성이 큽니다. 사용자 지정 위치를 사용했다면 해당 위치에서 라우트 트리를 가져와야 합니다.

import { routeTree } from './routeTree.gen'

코드 기반 라우트 트리

코드 기반 라우팅을 사용했다면 루트 라우트의 addChildren 메서드를 사용해 라우트 트리를 직접 만들었을 가능성이 큽니다.

const routeTree = rootRoute.addChildren([
// ...
])

라우터 타입 안전성

[!IMPORTANT] 이 섹션을 건너뛰지 마세요! ⚠️

TanStack Router는 라이브러리에서 직접 가져오는 bare import처럼 예상하기 어려운 경우에도 TypeScript를 훌륭하게 지원합니다. 이를 위해 TypeScript의 Declaration Merging 기능을 사용해 라우터 타입을 등록해야 합니다. router 인스턴스 타입을 갖는 router 속성을 @tanstack/react-routerRegister 인터페이스에 추가해 등록합니다.

React

src/router.tsx
declare module '@tanstack/react-router' {
interface Register {
// This infers the type of our router and registers it across your entire project
router: typeof router
}
}

Solid

src/router.tsx
declare module '@tanstack/solid-router' {
interface Register {
// This infers the type of our router and registers it across your entire project
router: typeof router
}
}

라우터를 등록하면 라우팅과 관련된 모든 항목에서 프로젝트 전체에 타입 안전성이 적용됩니다.

404 찾을 수 없음 라우트

이전 가이드에서 약속했듯이 이제 notFoundRoute 옵션을 살펴봅니다. 이 옵션은 적합한 매칭을 찾지 못했을 때 렌더링할 라우트를 구성하는 데 사용합니다. 404 페이지를 렌더링하거나 기본 라우트로 리디렉션할 때 유용합니다.

파일 기반 라우팅 또는 코드 기반 라우팅을 사용한다면 createRootRoutenotFoundComponent 키를 추가해야 합니다.

export const Route = createRootRoute({
component: () => (
// ...
),
notFoundComponent: () => <div>404 Not Found</div>,
});

기타 옵션

Router 생성자에 전달할 수 있는 다른 옵션도 많습니다. 전체 목록은 API Reference에서 확인할 수 있습니다.