본문 바로가기
ai

TanStack Start v1 완벽 가이드 2026 — Next.js 대안 풀스택 React 메타프레임워크·Server Functions·TanStack Query 통합 완전 정복

by bamsik 2026. 3. 17.
반응형

TanStack Start란 무엇인가?

TanStack Start는 2025년 11월 v1.0으로 정식 출시된 풀스택 React 메타 프레임워크입니다. TanStack Query, TanStack Router 등으로 유명한 Tanner Linsley가 이끄는 TanStack 팀이 개발했습니다.

Next.js와 Remix가 서버 우선(Server-First) 접근법을 취하는 반면, TanStack Start는 클라이언트 우선(Client-First)으로 서버 기능을 더한 독특한 철학을 가지고 있습니다. Vite를 기반으로 빌드되어 개발 경험(DX)이 매우 빠릅니다.

왜 2026년에 TanStack Start인가?

LogRocket의 2026 웹 개발 트렌드 분석에서 "TanStack-ification of frontend development"라는 표현이 등장할 정도로, TanStack 생태계는 이미 프론트엔드 개발의 표준이 되어가고 있습니다.

  • TanStack Query → 데이터 페칭/캐싱 표준
  • TanStack Router → 타입 세이프 라우팅 표준
  • TanStack Table → 복잡한 테이블 UI 표준
  • TanStack Start → 풀스택 React 앱의 새로운 표준

2026년에는 Next.js 독주 체제에서 벗어나 TanStack Start, Remix, Astro가 더욱 다양한 선택지를 제공하는 다원화 시대가 열리고 있습니다.

TanStack Start vs Next.js — 핵심 차이점

철학적 차이

항목 TanStack Start Next.js
렌더링 기본값 클라이언트 우선 + SSR 선택적 서버 컴포넌트 기본
라우터 TanStack Router (타입 세이프) App Router (파일 기반)
빌드 도구 Vite (초고속) Turbopack / Webpack
데이터 페칭 Server Functions + TanStack Query Server Actions + fetch
상태 관리 TanStack Query 네이티브 통합 별도 라이브러리 필요
학습 곡선 TanStack 경험자에게 자연스러움 React Server Components 이해 필요
호스팅 Vercel, Netlify, 셀프호스팅 Vercel 최적화

TanStack Start의 핵심 강점

  1. 완전한 타입 안전성: URL 파라미터부터 서버 함수 반환값까지 end-to-end 타입 추론
  2. Vite 기반 초고속 개발: HMR(Hot Module Replacement)이 즉각적
  3. TanStack Query 네이티브 통합: 서버 데이터를 클라이언트 캐시와 완벽하게 동기화
  4. 이식성: 특정 플랫폼에 종속되지 않는 표준 Web API 기반

TanStack Start 핵심 개념

1. 파일 기반 라우팅 (TanStack Router 기반)

TanStack Start는 TanStack Router의 파일 기반 라우팅을 사용합니다. routes/ 폴더 구조가 URL 구조와 1:1 매핑됩니다.

src/
├── routes/
│   ├── __root.tsx          # 루트 레이아웃
│   ├── index.tsx           # / 홈 페이지
│   ├── about.tsx           # /about
│   ├── posts/
│   │   ├── index.tsx       # /posts 목록
│   │   └── $postId.tsx     # /posts/:postId (동적 라우트)
│   └── dashboard/
│       ├── _layout.tsx     # 대시보드 레이아웃
│       └── index.tsx       # /dashboard
└── router.tsx

2. Server Functions — 풀스택의 핵심

Server Functions는 TanStack Start의 핵심 기능으로, 클라이언트에서 서버 로직을 직접 호출하는 타입 세이프한 방법입니다. RPC(Remote Procedure Call)처럼 동작합니다.

// app/functions/posts.ts
import { createServerFn } from '@tanstack/start';
import { z } from 'zod';

// 게시글 목록 조회 서버 함수
export const getPosts = createServerFn()
  .validator(z.object({
    page: z.number().default(1),
    limit: z.number().default(10),
  }))
  .handler(async ({ data }) => {
    const posts = await db.post.findMany({
      skip: (data.page - 1) * data.limit,
      take: data.limit,
      orderBy: { createdAt: 'desc' },
      include: { author: true },
    });
    return posts;
  });

// 게시글 생성 서버 함수
export const createPost = createServerFn({ method: 'POST' })
  .validator(z.object({
    title: z.string().min(1),
    content: z.string(),
  }))
  .handler(async ({ data, context }) => {
    // 서버에서만 실행됨 — 보안 로직 안전
    const post = await db.post.create({ data });
    return post;
  });

3. 라우트에서 데이터 로딩

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

export const Route = createFileRoute('/posts/$postId')({
  // 라우트 진입 전 데이터 프리로드
  loader: async ({ params }) => {
    const post = await getPost({ data: { id: params.postId } });
    return { post };
  },
  component: PostPage,
});

function PostPage() {
  const { post } = Route.useLoaderData();
  // post는 완전히 타입 추론됨!
  
  return (
    <article>
      <h1>{post.title}</h1>
      <p>{post.content}</p>
    </article>
  );
}

4. TanStack Query와의 통합

TanStack Start의 가장 강력한 기능은 Server Functions와 TanStack Query의 자연스러운 통합입니다.

// 클라이언트에서 서버 함수를 Query로 사용
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { getPosts, createPost } from '../functions/posts';

function PostList() {
  const queryClient = useQueryClient();
  
  // 서버 함수를 Query로 래핑
  const { data: posts, isLoading } = useQuery({
    queryKey: ['posts'],
    queryFn: () => getPosts({ data: { page: 1 } }),
  });
  
  // 뮤테이션 + 캐시 무효화
  const mutation = useMutation({
    mutationFn: (newPost) => createPost({ data: newPost }),
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: ['posts'] });
    },
  });
  
  return (
    <div>
      {posts?.map(post => <PostCard key={post.id} post={post} />)}
    </div>
  );
}

빠른 시작 가이드

Step 1: 프로젝트 생성

# 공식 템플릿으로 시작
npx create-tsrouter-app@latest my-app --template start-basic

cd my-app
npm install
npm run dev

Step 2: 데이터베이스 연결 (Drizzle ORM 추천)

npm install drizzle-orm drizzle-kit better-sqlite3

# db/schema.ts
import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';

export const posts = sqliteTable('posts', {
  id: integer('id').primaryKey({ autoIncrement: true }),
  title: text('title').notNull(),
  content: text('content'),
  createdAt: integer('created_at', { mode: 'timestamp' })
    .$defaultFn(() => new Date()),
});

Step 3: 배포

# Vercel 배포
npm install -g vercel
vercel deploy

# Netlify 배포
npm install -g netlify-cli
netlify deploy --prod

# 셀프 호스팅 (Node.js)
npm run build
node .output/server/index.mjs

실제 사용 사례 — 언제 TanStack Start를 선택해야 하나?

✅ TanStack Start가 적합한 경우

  • TanStack Query를 이미 사용 중인 팀
  • 복잡한 클라이언트 상태 관리가 필요한 앱 (대시보드, SaaS 도구)
  • End-to-end 타입 안전성이 최우선인 프로젝트
  • Vite의 빠른 개발 환경을 원하는 팀
  • 특정 호스팅 플랫폼에 종속되기 싫은 경우

✅ Next.js가 여전히 적합한 경우

  • SEO가 중요한 콘텐츠 중심 사이트
  • Vercel 생태계를 적극 활용하는 경우
  • React Server Components를 최대한 활용하고 싶은 경우
  • 팀 전체가 Next.js에 익숙한 경우

2026년 TanStack 생태계 전망

TanStack은 2026년에도 계속 확장되고 있습니다. TanStack DB(클라이언트 사이드 반응형 데이터베이스), TanStack AI(AI 스트림 처리), TanStack Store(프레임워크 독립 상태 관리) 등 새로운 라이브러리들이 생태계를 더욱 풍부하게 만들고 있습니다.

TanStack Start는 Next.js를 대체하는 것이 아니라 다양한 프로젝트 요구사항에 맞는 최적의 선택지를 제공합니다. 특히 클라이언트 상태가 복잡한 B2B SaaS, 관리자 대시보드, 데이터 집약적 앱에서 TanStack Start의 강점이 빛납니다.


📎 참고 자료

반응형