이 글은 누구를 위한 것인가
- Next.js 15로 마이그레이션하면서 Turbopack 전환을 고려하는 팀
- Vite 기반 프로젝트가 규모 커지면서 빌드 속도가 느려진 팀
- 새 프로젝트에서 어떤 빌드 도구를 선택해야 할지 결정해야 하는 개발자
들어가며
2024년까지는 "Vite면 충분하다"였다. 2026년에는 Turbopack이 Next.js 15의 기본 빌드 도구가 되었고, Rust 기반의 번들러들이 성숙해졌다. 선택지가 늘었다는 것은 각 상황에 맞는 도구를 골라야 한다는 의미다.
이 글은 bluefoxdev.kr의 프론트엔드 빌드 도구 가이드 를 참고하고, 2026년 기준 실전 선택 기준 관점에서 확장하여 작성했습니다.
1. 도구 현황
[2026년 빌드 도구 지형]
Vite (Evan You / VoidZero):
버전: 6.x
번들러: Rollup (프로덕션) + esbuild (개발)
특징: 플러그인 생태계 성숙, React/Vue/Svelte 모두 지원
용도: SPA, 라이브러리, 비-Next.js 프로젝트
Turbopack (Vercel):
버전: Next.js 15 기본 내장
언어: Rust
특징: Next.js 전용, 증분 빌드, 모듈 그래프 캐싱
용도: Next.js 프로젝트 전용
Rspack (ByteDance):
특징: webpack API 호환, Rust 기반
용도: webpack 마이그레이션 경로, 대규모 앱
webpack 5:
상태: 레거시 유지 관리, 신규 프로젝트 비권장
2. 성능 비교
[벤치마크 — 중규모 Next.js 앱 기준 (2026년 Q1)]
콜드 스타트 (dev 서버 최초 시작):
Turbopack: 1.2초
Vite: 3.8초
webpack 5: 18.4초
HMR (파일 저장 후 반영):
Turbopack: ~50ms
Vite: ~200ms
webpack 5: ~1200ms
프로덕션 빌드 (1000 컴포넌트):
Vite: 22초
Turbopack: 18초 (Next.js 15 빌드)
webpack 5: 145초
캐시 후 재빌드:
Turbopack: ~3초 (증분 빌드)
Vite: ~8초
webpack 5: ~35초
메모리 사용량 (개발 서버):
Vite: 480MB
Turbopack: 720MB ← 더 많이 사용
webpack 5: 1.2GB
3. Vite 6 설정
// vite.config.ts
import { defineConfig, splitVendorChunkPlugin } from 'vite';
import react from '@vitejs/plugin-react';
import { visualizer } from 'rollup-plugin-visualizer';
export default defineConfig(({ mode }) => ({
plugins: [
react({
// React Compiler (Forget) 통합
babel: {
plugins: [['babel-plugin-react-compiler', {}]],
},
}),
splitVendorChunkPlugin(),
mode === 'analyze' && visualizer({
filename: 'dist/stats.html',
open: true,
gzipSize: true,
}),
].filter(Boolean),
build: {
target: 'esnext',
minify: 'esbuild',
rollupOptions: {
output: {
// 청크 분할 전략
manualChunks: {
'vendor-react': ['react', 'react-dom'],
'vendor-router': ['react-router-dom'],
'vendor-query': ['@tanstack/react-query'],
},
},
},
// 청크 사이즈 경고 기준 (500KB)
chunkSizeWarningLimit: 500,
},
// 경로 별칭
resolve: {
alias: {
'@': '/src',
'@components': '/src/components',
'@hooks': '/src/hooks',
},
},
// 환경변수 타입 안전성
define: {
__APP_VERSION__: JSON.stringify(process.env.npm_package_version),
},
server: {
port: 3000,
proxy: {
'/api': {
target: 'http://localhost:8000',
changeOrigin: true,
},
},
},
}));
4. Next.js + Turbopack 설정
// next.config.ts (Next.js 15)
import type { NextConfig } from 'next';
const nextConfig: NextConfig = {
// Turbopack은 Next.js 15에서 기본값 (--turbopack 불필요)
experimental: {
// React Compiler
reactCompiler: true,
// 타입 세이프 링크
typedRoutes: true,
// PPR (Partial Pre-Rendering)
ppr: true,
},
// 이미지 최적화
images: {
formats: ['image/avif', 'image/webp'],
remotePatterns: [
{ protocol: 'https', hostname: 'cdn.myapp.com' },
],
},
};
export default nextConfig;
# 개발 서버 (Turbopack 자동 사용)
next dev
# 프로덕션 빌드 (webpack or Turbopack, 설정에 따라)
next build
# 번들 분석
ANALYZE=true next build
5. 선택 기준
[프로젝트 유형별 권장 도구]
Next.js 앱:
→ Turbopack (기본값, 변경 이유 없음)
React SPA (Next.js 아님):
→ Vite 6
Vue/Svelte:
→ Vite 6
라이브러리 패키지:
→ Vite 6 (lib 모드) 또는 tsup
webpack 대규모 레거시 프로젝트:
→ Rspack (API 호환, 점진 마이그레이션)
[Vite → Turbopack 마이그레이션 고려 시]
✅ Next.js 15 프로젝트
✅ 개발 서버 속도가 병목
✅ Vercel 배포 환경
❌ Vite 플러그인 의존성이 많은 경우
❌ Next.js 외 다른 프레임워크 사용
❌ 커스텀 번들 설정이 복잡한 경우
마무리
2026년 기준으로 "가장 빠른 빌드 도구"는 Turbopack이지만, Next.js 전용이라는 제약이 있다. Next.js를 쓴다면 Turbopack을 사용하지 않을 이유가 없다. 그 외 프레임워크나 SPA에서는 Vite 6이 여전히 최선의 선택이다.
도구보다 더 중요한 것은 코드 스플리팅과 캐싱 전략이다. 빌드 도구를 바꾸는 것보다 번들 최적화가 실제 사용자 경험에 더 큰 영향을 준다.