본문으로 건너뛰기

라우팅

TanStack Start는 TanStack Router를 기반으로 구축되므로 TanStack Router의 모든 기능을 사용할 수 있습니다.

[!NOTE] TanStack Router의 기능과 역량을 자세히 알아보려면 TanStack Router 문서를 읽어보시기를 적극 권장합니다. 여기서 배우는 내용은 TanStack Router와 Start에서의 작동 방식을 개괄적으로 살펴보는 수준입니다.

라우터​

router.tsx 파일은 Start 내에서 사용되는 TanStack Router의 동작을 결정하는 파일입니다. 프로젝트의 src 디렉터리에 있습니다.

src/
├── router.tsx

여기에서 기본 프리로딩 기능부터 캐시의 오래됨 기준까지 모든 것을 구성할 수 있습니다.

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

// You must export a getRouter function that
// returns a new router instance each time
export function getRouter() {
const router = createRouter({
routeTree,
scrollRestoration: true,
})

return router
}

파일 기반 라우팅​

Start는 적절한 코드 분할과 고급 타입 안전성을 보장하기 위해 TanStack Router의 파일 기반 라우팅 방식을 사용합니다.

라우트는 src/routes 디렉터리에서 찾을 수 있습니다.

src/
├── routes <-- This is where you put your routes
│ ├── __root.tsx
│ ├── index.tsx
│ ├── about.tsx
│ ├── posts.tsx
│ ├── posts/$postId.tsx

루트 라우트​

루트 라우트는 전체 트리에서 최상위에 있는 라우트이며, 다른 모든 라우트를 자식으로 포함합니다. src/routes/__root.tsx 파일에 있으며 이름은 반드시 __root.tsx이어야 합니다.

src/
├── routes
│ ├── __root.tsx <-- The root route
  • 경로가 없으며 항상 일치합니다
  • 해당 component은 항상 렌더링됩니다
  • 여기에서 문서 셸(예: <html>, <body> 등)을 렌더링합니다
  • 항상 렌더링되므로 애플리케이션 셸을 구성하고 전역 로직을 처리하기에 가장 적합한 위치입니다
// src/routes/__root.tsx
import {
Outlet,
createRootRoute,
HeadContent,
Scripts,
} from '@tanstack/react-router'
import type { ReactNode } from 'react'

export const Route = createRootRoute({
head: () => ({
meta: [
{
charSet: 'utf-8',
},
{
name: 'viewport',
content: 'width=device-width, initial-scale=1',
},
{
title: 'TanStack Start Starter',
},
],
}),
component: RootComponent,
})

function RootComponent() {
return (
<RootDocument>
<Outlet />
</RootDocument>
)
}

function RootDocument({ children }: Readonly<{ children: ReactNode }>) {
return (
<html>
<head>
<HeadContent />
</head>
<body>
{children}
<Scripts />
</body>
</html>
)
}

<body> 태그 하단에 있는 Scripts 컴포넌트를 확인합니다. 이 컴포넌트는 애플리케이션의 모든 클라이언트 측 JavaScript를 로드하는 데 사용되며, 올바른 작동을 위해 항상 포함해야 합니다.

HeadContent 컴포넌트​

HeadContent 컴포넌트는 문서의 head, title, meta, link 및 head 관련 script 태그를 렌더링하는 데 사용됩니다.

루트 라우트 레이아웃의 <head> 태그에서 렌더링해야 합니다.

Outlet 컴포넌트​

Outlet 컴포넌트는 다음으로 일치할 가능성이 있는 자식 라우트를 렌더링하는 데 사용됩니다. <Outlet />는 props를 받지 않으며 라우트의 컴포넌트 트리 내 어디에서나 렌더링할 수 있습니다. 일치하는 자식 라우트가 없으면 <Outlet />는 null을 렌더링합니다.

Scripts 컴포넌트​

Scripts 컴포넌트는 문서의 body 스크립트를 렌더링하는 데 사용됩니다.

루트 라우트 레이아웃의 <body> 태그 안에 렌더링해야 합니다.

라우트 트리 생성​

프로젝트에서 routeTree.gen.ts 파일을 볼 수 있습니다.

src/
├── routeTree.gen.ts <-- The generated route tree file

이 파일은 TanStack Start를 실행할 때(npm run dev 또는 npm run start을 통해) 자동으로 생성됩니다. 이 파일에는 생성된 라우트 트리와 TanStack Start의 타입 안전성을 매우 빠르게 유지하면서 모든 타입을 추론할 수 있게 하는 몇 가지 TS 유틸리티가 포함되어 있습니다.

중첩 라우팅​

TanStack Router는 중첩 라우팅을 사용하여 URL을 렌더링할 올바른 컴포넌트 트리와 일치시킵니다.

예를 들어 다음과 같은 라우트가 있다고 가정합니다.

routes/
├── __root.tsx <-- Renders the <Root> component
├── posts.tsx <-- Renders the <Posts> component
├── posts.$postId.tsx <-- Renders the <Post> component

URL은 다음과 같습니다: /posts/123

컴포넌트 트리는 다음과 같습니다.

<Root>
<Posts>
<Post />
</Posts>
</Root>

라우트 유형​

프로젝트에서 생성할 수 있는 라우트 유형은 몇 가지가 있습니다.

  • 인덱스 라우트 - URL이 라우트의 경로와 정확히 같을 때 일치합니다
  • 동적/와일드카드/Splat 라우트 - 애플리케이션에서 사용할 수 있도록 URL 경로의 일부 또는 전체를 변수로 동적으로 캡처합니다

라우트를 그룹화하고 구성하는 데 사용할 수 있는 유틸리티 라우트 유형도 몇 가지 있습니다

  • 경로 없는 레이아웃 라우트(경로에 중첩하지 않고 라우트 그룹에 레이아웃이나 로직을 적용합니다)
  • 비중첩 라우트(상위 라우트와의 중첩을 해제하고 자체 컴포넌트 트리를 렌더링합니다)
  • 그룹화된 라우트(경로 계층 구조에 영향을 주지 않고 구성을 위해 디렉터리에서 라우트를 함께 그룹화합니다)

라우트 트리 구성​

라우트 트리는 src/routes 디렉터리에서 구성됩니다.

파일 라우트 생성​

라우트를 생성하려면 생성하려는 라우트의 경로에 해당하는 새 파일을 만듭니다. 예:

경로파일명유형
/index.tsx인덱스 라우트
/aboutabout.tsx정적 라우트
posts.tsx"레이아웃" 라우트
/posts/posts/index.tsx인덱스 라우트
/posts/:postIdposts/$postId.tsx동적 라우트
/rest/*rest/$.tsx와일드카드 라우트

라우트 정의​

라우트를 정의하려면 createFileRoute 함수를 사용하여 라우트를 Route 변수로 내보냅니다.

예를 들어 /posts/:postId 라우트를 처리하려면 여기에 posts/$postId.tsx 파일을 생성합니다:

src/
├── routes
│ ├── posts/$postId.tsx

그런 다음 라우트를 다음과 같이 정의합니다:

// src/routes/posts/$postId.tsx
import { createFileRoute } from '@tanstack/react-router'

export const Route = createFileRoute('/posts/$postId')({
component: PostComponent,
})

[!NOTE] createFileRoute에 전달되는 경로 문자열은 TanStack Router Bundler Plugin 또는 Router CLI를 통해 라우터가 자동으로 작성하고 관리합니다. 따라서 새 라우트를 생성하거나 라우트를 이동하거나 이름을 변경하면 경로가 자동으로 업데이트됩니다.

이것은 단지 "시작"일 뿐입니다​

지금까지 TanStack Router를 사용하여 라우트를 구성하는 방법을 개괄적으로 살펴보았습니다. 자세한 내용은 TanStack Router 문서를 참조하세요.