---
id: devops-build-performance
title: Build Performance — 빌드 시간 측정과 단축
category: Coding
status: draft
source_trust_level: B
verification_status: conceptual
created_at: 2026-05-09
updated_at: 2026-05-09
tags: [devops, build, performance, vite, esbuild, vibe-coding]
tech_stack: { language: "Vite / esbuild / SWC / Webpack", applicable_to: ["Web", "Backend"] }
applied_in: []
aliases: [bundler, esbuild, swc, tsc, profile]
---

# Build Performance

> "왜 느린지" 측정 안 하고 추측 최적화 = 시간 낭비. **profile → 가장 큰 단일 원인 → 도구 교체 또는 캐시**. 2026 권장: Vite (esbuild + Rollup), Turbopack (Webpack 후속), SWC, esbuild.

## 📖 핵심 개념
- Bundle: 여러 파일 → 하나/적은 수.
- Compile: TS/JSX → JS. tsc 느림, swc/esbuild 100x.
- Type check: tsc --noEmit 별도 — bundle 과 분리.
- Cache: incremental build, persistent.

## 💻 코드 패턴

### Vite 기본 (가장 빠른 dev)
```ts
// vite.config.ts
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react-swc'; // SWC 사용

export default defineConfig({
  plugins: [react()],
  build: {
    target: 'es2022',
    sourcemap: true,
    rollupOptions: {
      output: {
        manualChunks: {
          react: ['react', 'react-dom'],
          ui: ['@radix-ui/react-dialog', '@radix-ui/react-dropdown-menu'],
        },
      },
    },
  },
});
```

### TypeScript — tsc 분리
```json
// package.json
{
  "scripts": {
    "build": "vite build",                      // 빠름
    "typecheck": "tsc --noEmit",                // 별도, 병렬
    "typecheck:watch": "tsc --noEmit --watch",
    "ci": "npm run typecheck && npm run build && npm test"
  }
}
```

### tsc incremental
```json
// tsconfig.json
{
  "compilerOptions": {
    "incremental": true,
    "tsBuildInfoFile": ".tsbuildinfo"
  }
}
```

### Bundle 분석
```bash
npx vite-bundle-visualizer
# 또는
npx source-map-explorer dist/assets/*.js
```

큰 dependency 발견 → tree-shake / 동적 import / 교체.

### Profile build
```bash
NODE_OPTIONS=--cpu-prof npm run build
# .cpu-prof 파일을 Chrome devtools 에서 분석
```

### Esbuild 직접 (작은 프로젝트, 매우 빠름)
```ts
import { build } from 'esbuild';

await build({
  entryPoints: ['src/index.ts'],
  bundle: true,
  outfile: 'dist/index.js',
  platform: 'node',
  target: 'node20',
  format: 'esm',
  external: ['vscode'],
  minify: true,
});
```
대형 프로젝트도 1초.

### Cache — Turbo / Nx
```bash
turbo run build  # 변경 안 된 패키지 cache hit
```

### Parallel CI
```yaml
strategy:
  matrix:
    shard: [1/4, 2/4, 3/4, 4/4]
steps:
  - run: npm test -- --shard=${{ matrix.shard }}
```

## 🤔 의사결정 기준
| 작업 | 도구 |
|---|---|
| Web dev | Vite + SWC |
| Web prod bundle | Vite (Rollup 내장) 또는 Turbopack |
| Node.js single binary | esbuild bundle + node executable |
| TS typecheck | tsc --noEmit (별도) |
| Test runner | Vitest (Vite 호환) 또는 Jest with SWC |
| Linter | Biome (Rust, fast) 또는 ESLint + SWC |

## ❌ 안티패턴
- **build = bundle + typecheck + test 한 명령**: 한 fail 모두 다시. 분리 + 병렬.
- **tsc 로 bundle**: 느림 + tree-shake 약함.
- **dev 와 prod 다른 bundler**: 일관성 깨짐.
- **모든 의존성 단일 chunk**: 큰 first paint. manual chunks.
- **source map prod 에 inline**: 번들 크기 폭발 + 비밀 노출. external + Sentry upload.
- **node_modules cache 안 함 in CI**: 매번 npm install 1분+.
- **measure 없이 추측 최적화**: 의미 없는 변경.

## 🤖 LLM 활용 힌트
- "Vite + SWC + Vitest + Biome" 가 2026 빠른 스택.
- typecheck 는 항상 분리 / 병렬.

## 🔗 관련 문서
- [[DevOps_CI_CD_Pipeline_Patterns]]
- [[React_Code_Splitting]]
