[๋ฒˆ์—ญ] Vite vs. Turbopack vs. Rspack

์›๋ณธ์˜ ๊ธ€์€ DEV CommunityVite vs. Turbopack vs. Rspack: Which Build Tool Wins the Modern Frontend Race ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


ํ”„๋ŸฐํŠธ์—”๋“œ ํˆด๋ง ์ง€ํ˜•์€ '์›Œํ”„ ์†๋„'๋กœ ๋ณ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ๋•Œ ๋ถ€๋™์˜ ์™•์ด์—ˆ๋˜ Webpack์€ ์ด์ œ ์ฆ‰๊ฐ์ ์ธ ํ”ผ๋“œ๋ฐฑ, ๋” ๊ฐ„๊ฒฐํ•œ ์„ค์ •, ๊ทธ๋ฆฌ๊ณ  ์ตœ์‹  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ƒํƒœ๊ณ„์™€์˜ ๋” ์ด˜์ด˜ํ•œ ํ†ตํ•ฉ์„ ์•ฝ์†ํ•˜๋Š” ์‹ ์„ธ๋Œ€ ๋ฒˆ๋“ค๋Ÿฌ๋“ค์˜ ๋„์ „์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์†Œ๊ฐœ(Introduction)

์˜ค๋Š˜๋‚  React, Vue, Svelte ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒˆ๋กœ ์‹œ์ž‘ํ•  ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ๋‚ด๋ฆฌ๋Š” ๊ฒฐ์ •์€ ์–ด๋–ค ๋นŒ๋“œ ํˆด์„ ๋ฏฟ๊ณ  ๊ฐˆ ๊ฒƒ์ธ๊ฐ€์ž…๋‹ˆ๋‹ค. ์ด ์„ ํƒ์€ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜, CI ์‹œ๊ฐ„, ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „๋‹ฌ๋˜๋Š” ์ตœ์ข… ๋ฒˆ๋“ค ํฌ๊ธฐ๊นŒ์ง€ ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค. Webpack์ด ์—ฌ์ „ํžˆ ๋งŽ์€ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋– ๋ฐ›์น˜๊ณ  ์žˆ๊ธด ํ•˜์ง€๋งŒ, 2023โ€“2024๋…„์— ๊ฐ€์žฅ ๋งŽ์€ ํ™”์ œ๋ฅผ ๋ชจ์€ ์‹ ํฅ ๊ฐ•์ž๋Š” ๋‹ค์Œ ์„ธ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

  • Vite โ€“ Rollup ์œ„์— ๊ตฌ์ถ•๋œ, "๊ฐœ๋ฐœ ์„œ๋ฒ„ ์šฐ์„ (dev server first)" ์ฒ ํ•™์˜ ์›์กฐ ๋„๊ตฌ
  • Turbopack โ€“ Webpack์˜ ํ›„์†์œผ๋กœ ํ™๋ณด๋˜๋Š” Rust ๊ธฐ๋ฐ˜ ๋„๊ตฌ๋กœ, "์›น์„ ์œ„ํ•œ ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฒˆ๋“ค๋Ÿฌ"๋ฅผ ํ‘œ๋ฐฉ
  • Rspack โ€“ Turbopack์˜ ์„ฑ๋Šฅ ์ด์ ์„ ๋” ๋„“์€ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์ œ๊ณตํ•˜๋ ค๋Š”, ์˜คํ”ˆ์†Œ์Šค Webpack ํ˜ธํ™˜(compatible) Turbopack ํด๋ก 

์ด ๊ธ€์—์„œ๋Š” ์†๋„, ์„ฑ์ˆ™๋„, ์ƒํƒœ๊ณ„ ์ ํ•ฉ์„ฑ์„ ๋น„๊ตํ•ด ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ ๋ชฉํ‘œ์— ๋งž๋Š” ๋„๊ตฌ๋ฅผ ๊ณ ๋ฅผ ์ˆ˜ ์žˆ๋„๋ก ๋•๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ ๋ฐฐ์šฐ๋Š” ๊ฒƒ(What You Will Learn)

  • ํ•ต์‹ฌ ์„ฑ๋Šฅ ์ง€ํ‘œ: ์ฝœ๋“œ ์Šคํƒ€ํŠธ, ์ ์ง„์ (incremental) ๋ฆฌ๋นŒ๋“œ, ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ
  • ๋ฌธ์„œ์˜ ๊นŠ์ด, ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒํƒœ๊ณ„, ์ปค๋ฎค๋‹ˆํ‹ฐ ์ฑ„ํƒ ๋“ฑ ์„ฑ์ˆ™๋„ ์ง€ํ‘œ
  • ์ผ๋ฐ˜์ ์ธ React + TypeScript ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ์‹ค์šฉ์ ์ธ ์„ค์ • ์˜ˆ์‹œ
  • ์›Œํฌํ”Œ๋กœ์— ๋งž๋Š” ๋„๊ตฌ๋ฅผ ๊ณ ๋ฅด๊ธฐ ์œ„ํ•œ ์˜์‚ฌ๊ฒฐ์ • ๋งคํŠธ๋ฆญ์Šค(Decision Matrix)

๋”ฅ ๋‹ค์ด๋ธŒ(Deep Dive)

1. ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์š”(Architecture Overview)

๋„๊ตฌ์ฝ”์–ด ์–ธ์–ด์ฃผ์š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐœ๋ฐœ ์„œ๋ฒ„ ๋ชจ๋ธํ”„๋กœ๋•์…˜ ๋ฒˆ๋“ค๋Ÿฌ
ViteJavaScript/TypeScriptesbuild(๊ฐœ๋ฐœ) + Rollup(ํ”„๋กœ๋•์…˜)๋„ค์ดํ‹ฐ๋ธŒ ESM ๊ฐœ๋ฐœ ์„œ๋ฒ„, ํ•„์š” ์‹œ(on-demand) ๋ณ€ํ™˜Rollup(ํŠธ๋ฆฌ ์…ฐ์ดํ‚น, ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…)
TurbopackRustRust ๊ธฐ๋ฐ˜ ์ฆ๋ถ„(incremental) ์ปดํŒŒ์ผ๋ŸฌRust์—์„œ์˜ ์˜์† ์›Œ์ปค ํ’€, ํŒŒ์ผ ์›Œ์นญRust ๊ธฐ๋ฐ˜ ๋ฒˆ๋“ค๋Ÿฌ, Webpack์˜ ๋ชจ๋“ˆ ๊ทธ๋ž˜ํ”„์™€ ์œ ์‚ฌ
RspackRustRust ๊ธฐ๋ฐ˜(Turbopack ํฌํฌ)Turbopack๊ณผ ๋™์ผํ•˜๋˜ Webpack ํ˜ธํ™˜ API ์ œ๊ณตTurbopack๊ณผ ์œ ์‚ฌ, Webpack ํ”Œ๋Ÿฌ๊ทธ์ธ ์ง€์›

์–ธ์–ด๊ฐ€ ์™œ ์ค‘์š”ํ•œ๊ฐ€

Rust๋Š” Turbopack๊ณผ Rspack์— ์›์ดˆ์ ์ธ CPU ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ ์ด์ ์„ ์ฃผ๋Š” ๋ฐ˜๋ฉด, Vite๋Š” ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ์ดˆ๊ณ ์† JavaScript ์—”์ง„ ๊ธฐ๋ฐ˜์˜ esbuild๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

2. ์‹œ์ž‘ ์†๋„ & ์ฆ๋ถ„ ๋นŒ๋“œ ์†๋„(Startup & Incremental Build Speed)

์‹œ๋‚˜๋ฆฌ์˜คVite (ms)Turbopack (ms)Rspack (ms)
์ฝœ๋“œ dev ์„œ๋ฒ„ ์‹œ์ž‘(React + TS)~350~120~130
์ž‘์€ ๋ณ€๊ฒฝ ํ›„ HMR(ํ•ซ ๋ชจ๋“ˆ ๊ต์ฒด)~30~8~9
์ „์ฒด ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ(์ตœ์ ํ™”)~1,800~720~750

์ธ์‚ฌ์ดํŠธ: Turbopack๊ณผ Rspack์€ ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ(๋Ÿฌ์ŠคํŠธ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฝ”์–ด๋ฅผ ํ™œ์šฉํ•ด ๋ณ‘๋ ฌํ™”ํ•  ์ˆ˜ ์žˆ์–ด) ์ „๋ฐ˜์ ์œผ๋กœ Vite๋ณด๋‹ค ๋” ์ข‹์€ ์ˆœ์ˆ˜ ์„ฑ๋Šฅ ์ˆ˜์น˜๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

3. ์„ฑ์ˆ™๋„ & ์ƒํƒœ๊ณ„(Maturity & Ecosystem)

ํ•ญ๋ชฉViteTurbopackRspack
์ฒซ ์•ˆ์ • ๋ฆด๋ฆฌ์Šค20202023 (๋ฒ ํƒ€)2023 (๋ฒ ํƒ€)
๊ณต์‹ ๋ฌธ์„œ ๊นŠ์ดโ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜†โ˜…โ˜…โ˜…โ˜…โ˜†
ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒํƒœ๊ณ„ ๊ทœ๋ชจ1,200๊ฐœ ์ด์ƒ50๊ฐœ ๋ฏธ๋งŒ(๊ณต์‹)~200๊ฐœ(Webpack ํ˜ธํ™˜)
์ปค๋ฎค๋‹ˆํ‹ฐ ์ฑ„ํƒ(GitHub ์Šคํƒ€)73k12k9k
ํ”„๋กœ๋•์…˜ ์‚ฌ์šฉ(์ฃผ์š” ์•ฑ)Vercel, VuePress, ๋‹ค์ˆ˜ ์Šคํƒ€ํŠธ์—…Meta ๋‚ด๋ถ€ ๋„๊ตฌ, Next.js(์‹คํ—˜์ )Alibaba, ByteDance, ์ผ๋ถ€ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ

Vite๋Š” ๊ฐ€์žฅ ๋„“์€ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒํƒœ๊ณ„์™€ ๊ฐ€์žฅ ๊ธด ์•ˆ์ • ๋ฆด๋ฆฌ์Šค์˜ ํŠธ๋ž™ ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Turbopack์€ ์•„์ง ์ดˆ๊ธฐ ๋„์ž… ๋‹จ๊ณ„์ด์ง€๋งŒ, ์„ฑ๋Šฅ ์ฃผ์žฅ์—๋Š” Meta์˜ ๋‚ด๋ถ€ ๋ฒค์น˜๋งˆํฌ๊ฐ€ ๋’ท๋ฐ›์นจ๋œ๋‹ค๊ณ  ์†Œ๊ฐœ๋ฉ๋‹ˆ๋‹ค. Rspack์€ Webpack ํ˜ธํ™˜์„ฑ์„ ์ œ๊ณตํ•˜๋ฉด์„œ๋„ Turbopack์˜ ์†๋„๋ฅผ ์ผ๋ถ€ ๊ณ„์Šนํ•ด ๊ทธ ๊ฐ„๊ทน์„ ๋ฉ”์šฐ๋ ค ํ•ฉ๋‹ˆ๋‹ค.

4. ์„ค์ • ์›Œํฌ์Šค๋ฃจ(Configuration Walkthrough)

์•„๋ž˜๋Š” React + TypeScript ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ์ตœ์†Œ ์„ค์ • ์˜ˆ์‹œ์ธ vite.config.ts, turbo.config.ts, rspack.config.js ์ž…๋‹ˆ๋‹ค.

Vite (vite.config.ts)

import {defineConfig }from'vite';
importreactfrom'@vitejs/plugin-react';

exportdefaultdefineConfig({
  plugins: [react()],
  server: {
    port:3000,
    open:true,
  },
  build: {
    target:'esnext',
    sourcemap:true,
  },
});

Turbopack (turbo.config.ts)

import {defineConfig }from'@turbopack/dev-server';
importreactRefreshfrom'@turbopack/react-refresh';

exportdefaultdefineConfig({
  entry:'./src/index.tsx',
  plugins: [reactRefresh()],
  devServer: {
    port:3000,
    hot:true,
  },
  optimization: {
    minify:true,
    target:'es2022',
  },
});

Rspack (rspack.config.js)

constReactRefreshWebpackPlugin=require('@pmmmwh/react-refresh-webpack-plugin');

module.exports= {
  entry:'./src/index.tsx',
  mode:'development',
  devServer: {
    hot:true,
    port:3000,
    open:true,
  },
  module: {
    rules: [
      {
        test:/\.(ts|tsx)$/,
        use:'babel-loader',
        exclude:/node_modules/,
      },
    ],
  },
  plugins: [newReactRefreshWebpackPlugin()],
  resolve: {
    extensions: ['.tsx','.ts','.js'],
  },
};

ํŒ: ์ด๋ฏธ Webpack ์„ค์ •์ด ์žˆ๋‹ค๋ฉด, Rspack์œผ๋กœ์˜ ์ „ํ™˜์€ ์ข…์ข… ๋ช‡ ๊ฐ€์ง€ ์˜์กด์„ฑ๋งŒ ๊ต์ฒดํ•˜๋ฉด ๋˜๋Š” ์ˆ˜์ค€์ด๋ผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋งˆ์ฐฐ์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค.

5. ์‹ค์ „ ๊ด€์ ์˜ ๊ณ ๋ ค์‚ฌํ•ญ(Realโ€‘World Considerations)

  1. ํŒ€ ์นœ์ˆ™๋„(Team Familiarity)
    1. Vite์˜ API๋Š” Rollup๊ณผ ์œ ์‚ฌํ•ด, ์ตœ์‹  ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์จ๋ณธ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ต์ˆ™ํ•˜๊ฒŒ ๋А๊ปด์ง‘๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด Turbopack์˜ Rust ์ค‘์‹ฌ ํˆด๋ง์€ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ”์ด๋„ˆ๋ฆฌ์— ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ํŒ€์—๊ฒ ํ•™์Šต ๊ณก์„ ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. CI/CD ํ†ตํ•ฉ(CI/CD Integration)
    1. ์„ธ ๋„๊ตฌ ๋ชจ๋‘ CI์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, Turbopack์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ(~30MB)๋Š” ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ด์–ด๋ฅผ ๋” ๋ฌด๊ฒ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Vite๋Š” Node ๊ธฐ๋ฐ˜ ์ ‘๊ทผ์ด๋ผ ์„œ๋ฒ„๋ฆฌ์Šค ํ™˜๊ฒฝ์—์„œ ๋” ๊ฐ€๋ณ๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ๋ฏธ๋ž˜ ๋Œ€๋น„(Futureโ€‘Proofing)
    1. ์›น์€ ์ ์  ESM-only ์ „๋‹ฌ ๋ฐฉ์‹์œผ๋กœ ์ด๋™ ์ค‘์ž…๋‹ˆ๋‹ค. Vite์˜ ๋„ค์ดํ‹ฐ๋ธŒ ESM ๊ฐœ๋ฐœ ์„œ๋ฒ„๋Š” ์ด ํ๋ฆ„๊ณผ ๋งค์šฐ ์ž˜ ๋งž๊ณ , Turbopack/Rspack๋„ ESM ์ถœ๋ ฅ ์ง€์›์„ ์ ๊ทน์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ์ค‘์ด๋ผ๊ณ  ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก (Conclusion)

์Šน์ž๋Š” ๋‹จ ํ•˜๋‚˜์˜ ๋„๊ตฌ๊ฐ€ ์•„๋‹ˆ๋ผ, ์—ฌ๋Ÿฌ๋ถ„ ํ”„๋กœ์ ํŠธ์˜ ์ œ์•ฝ๊ณผ ๋ชฉํ‘œ์— ๊ฐ€์žฅ ์ž˜ ๋งž๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

  • Vite๋ฅผ ์„ ํƒํ•˜์„ธ์š”: ์„ฑ์ˆ™ํ•œ ์ƒํƒœ๊ณ„, ๋น ๋ฅธ ์˜จ๋ณด๋”ฉ, Vue/React/Svelte์—์„œ ๊ฒ€์ฆ๋œ ํŠธ๋ž™ ๋ ˆ์ฝ”๋“œ๋ฅผ ์›ํ•œ๋‹ค๋ฉด
  • Turbopack์„ ๊ณ ๋ คํ•˜์„ธ์š”: ์ดˆ๋Œ€ํ˜• ๋ชจ๋…ธ๋ ˆํฌ์—์„œ์˜ ์ˆœ์ˆ˜ ์„ฑ๋Šฅ์ด ์ตœ์šฐ์„ ์ด๊ณ , ๋” ์ƒˆ๋กœ์šด Rust ๊ธฐ๋ฐ˜ ์›Œํฌํ”Œ๋กœ ๋„์ž…์— ๊ฑฐ๋ถ€๊ฐ์ด ์—†๋‹ค๋ฉด
  • Rspack์„ ๊ณ ๋ฅด์„ธ์š”: Webpack ํ˜ธํ™˜์„ฑ์ด ํ•„์š”ํ•˜์ง€๋งŒ Turbopack๊ธ‰ ์†๋„ ๊ฐœ์„ ๋„ ์›ํ•œ๋‹ค๋ฉด(ํŠนํžˆ ๋ ˆ๊ฑฐ์‹œ Webpack ์„ค์ •์„ ์˜ฎ๊ธฐ๋Š” ํŒ€์—๊ฒŒ)

์ฝœ ํˆฌ ์•ก์…˜: ์—ฌ๋Ÿฌ๋ถ„ ๋ ˆํฌ์˜ ์ž‘์€ ๋ธŒ๋žœ์น˜์—์„œ ๊ฐ ๋„๊ตฌ๋ฅผ ์ง์ ‘ ๋Œ๋ ค ๋ณด๊ณ , ์ฝœ๋“œ ์Šคํƒ€ํŠธ์™€ ๋ฆฌ๋นŒ๋“œ ์‹œ๊ฐ„์„ ์ธก์ •ํ•œ ๋’ค ๋ฐ์ดํ„ฐ๋กœ ๊ฒฐ์ •ํ•˜์„ธ์š”. ํ”„๋ŸฐํŠธ์—”๋“œ ์„ธ๊ณ„๋Š” ์‹คํ—˜์— ๋ณด์ƒํ•ฉ๋‹ˆ๋‹คโ€”ํ•˜๋‚˜๋ฅผ ๊ณจ๋ผ ๋ฐ˜๋ณต ๊ฐœ์„ ํ•˜๊ณ , ๋นŒ๋“œ๋ฅผ ๊ณ„์† ๋น ๋ฅด๊ฒŒ ์œ ์ง€ํ•˜์„ธ์š”.