12화. Vite, ESLint, TurboPack — 개발 툴도 트렌디하게!🧰
안녕하세요 🌟 오늘은 프론트엔드 필수 라이브러리 시리즈의 열두 번째이자 마지막 이야기로, 개발 생산성과 코드 품질을 높여주는 핵심 도구들인 Vite, ESLint, TurboPack에 대해 알아볼게요! 2025년 현재, 이 도구들은 현대적인 프론트엔드 개발 환경의 필수 요소가 되었답니다! 🛠️
개발 도구, 왜 중요할까요? 🤔
프론트엔드 개발자의 생산성과 코드 품질은 사용하는 도구에 크게 영향을 받아요. 좋은 개발 도구는:
- 개발 속도 향상: 빠른 빌드, 즉각적인 피드백으로 작업 속도 증가
- 코드 품질 보장: 일관된 코드 스타일과 버그 조기 발견
- 최적화된 결과물: 더 작고 빠른 애플리케이션 번들 생성
- 개발자 경험 향상: 스트레스 감소와 작업 만족도 증가
오늘 살펴볼 세 가지 도구는 각각 빌드 성능, 코드 품질, 대규모 애플리케이션 최적화라는 중요한 영역을 담당하고 있어요. 함께 알아볼까요?
1. Vite: 차세대 프론트엔드 빌드 도구 ⚡
Vite(프랑스어로 "빠르다"라는 뜻)는 Vue.js 창시자 Evan You가 개발한 빌드 도구로, 기존 웹팩 기반 도구들의 한계를 극복하고 개발 환경을 혁신적으로 개선했어요.
Vite의 주요 특징:
- 번들러 없는 개발 서버 🚀
- 기존 번들러와 달리 ESM(ES Modules)을 활용한 빠른 시작
- 코드 변경 시 거의 즉각적인 리로딩
- 최적화된 빌드 📦
- 프로덕션 빌드에 Rollup 활용으로 최적화된 번들 생성
- 코드 분할, 트리 쉐이킹 자동 지원
- 풍부한 플러그인 생태계 🔌
- 거의 모든 프론트엔드 프레임워크 지원
- 다양한 기능을 위한 확장 플러그인
- 구성 간소화 ⚙️
- 합리적인 기본값으로 최소한의 설정만 필요
- 필요 시 유연한 커스터마이징 가능
# Vite 프로젝트 생성
npm create vite@latest my-vite-app
# 또는
yarn create vite my-vite-app
# 또는
pnpm create vite my-vite-app
# 템플릿 선택 (React, Vue, Svelte, Vanilla, Preact 등)
# TypeScript 옵션 선택 가능
Vite 설정 및 사용법:
1. 기본 vite.config.js
// vite.config.js
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import path from 'path';
export default defineConfig({
// 사용할 프레임워크 플러그인 설정
plugins: [react()],
// 개발 서버 설정
server: {
port: 3000,
open: true, // 자동으로 브라우저 열기
proxy: {
// API 프록시 설정
'/api': {
target: 'http://localhost:8080',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '')
}
}
},
// 빌드 최적화 설정
build: {
outDir: 'dist',
minify: 'terser', // 'terser' 또는 'esbuild'
sourcemap: true,
// 청크 분할 전략
rollupOptions: {
output: {
manualChunks: {
vendor: ['react', 'react-dom'],
ui: ['@mui/material', '@emotion/react']
}
}
}
},
// 경로 별칭 설정
resolve: {
alias: {
'@': path.resolve(__dirname, './src'),
'@components': path.resolve(__dirname, './src/components'),
'@assets': path.resolve(__dirname, './src/assets')
}
}
});
2. 환경 변수와 모드
// .env 파일
VITE_API_URL=https://api.production.com
// .env.development
VITE_API_URL=http://localhost:8080
// 환경 변수 사용
// src/api/client.js
const apiUrl = import.meta.env.VITE_API_URL;
// 다른 모드로 실행
// package.json
{
"scripts": {
"dev": "vite", // 개발 모드
"build": "vite build", // 프로덕션 모드
"build:staging": "vite build --mode staging", // 스테이징 모드
"preview": "vite preview" // 빌드 결과 미리보기
}
}
3. CSS 전처리기와 PostCSS
// vite.config.js
export default defineConfig({
// ...
css: {
preprocessorOptions: {
scss: {
additionalData: `@import "@/styles/variables.scss";`
}
},
postcss: {
plugins: [
autoprefixer(),
postcssNesting()
]
},
// CSS 모듈 설정
modules: {
scopeBehaviour: 'local',
localsConvention: 'camelCase'
}
}
});
// SCSS 사용 예시
// src/components/Button.module.scss
.button {
background-color: $primary-color;
&:hover {
background-color: darken($primary-color, 10%);
}
}
// 컴포넌트에서 사용
import styles from './Button.module.scss';
function Button() {
return <button className={styles.button}>클릭</button>;
}
4. 유용한 Vite 플러그인
// vite.config.js
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import legacy from '@vitejs/plugin-legacy'; // IE11 지원
import compression from 'vite-plugin-compression'; // Gzip/Brotli 압축
import { visualizer } from 'rollup-plugin-visualizer'; // 번들 크기 시각화
export default defineConfig({
plugins: [
react(),
// 레거시 브라우저 지원
legacy({
targets: ['defaults', 'not IE 11']
}),
// 번들 압축
compression({
algorithm: 'brotli',
ext: '.br'
}),
// 번들 크기 시각화 (build 후 stats.html 생성)
visualizer({
open: true,
gzipSize: true,
brotliSize: true
})
]
});
2025년 Vite 5.x의 최신 기능:
- 더 빠른 HMR: 코드 변경 후 거의 즉시 반영
- ESM 우선: ES 모듈 기반 아키텍처 강화
- 서버 컴포넌트 지원: React Server Components 통합
- Rust 기반 최적화: 일부 내부 로직 Rust로 재작성하여 성능 향상
2. ESLint: 코드 품질의 수호자 🛡️
ESLint는 자바스크립트/타입스크립트 코드에서 문제점을 찾고 교정하는 정적 분석 도구로, 일관된 코드 스타일과 잠재적 버그 방지에 큰 역할을 해요.
ESLint의 주요 특징:
- 정적 코드 분석 🔍
- 실행 전 코드에서 잠재적 문제 발견
- 코드 실행 없이 패턴만으로 분석
- 커스터마이징 가능한 규칙 📏
- 수백 가지의 내장 규칙
- 팀에 맞는 규칙 선택 및 커스텀 규칙 작성 가능
- 자동 수정 기능 🔧
- 많은 규칙에 대한 자동 수정 지원
- 코드 품질 일관성 유지
- 플러그인 및 공유 설정 🔄
- 다양한 프레임워크, 라이브러리 관련 규칙 제공
- 인기 있는 스타일 가이드 미리 설정(Airbnb, Google 등)
# ESLint 설치
npm install eslint --save-dev
# 설정 파일 초기화
npx eslint --init
ESLint 설정 및 사용법:
1. 기본 설정 파일
// .eslintrc.js
module.exports = {
// 환경 설정
env: {
browser: true,
es2025: true,
node: true,
jest: true
},
// 확장 설정
extends: [
'eslint:recommended',
'plugin:react/recommended',
'plugin:react-hooks/recommended',
'plugin:@typescript-eslint/recommended',
'plugin:import/errors',
'plugin:import/warnings',
'plugin:import/typescript',
'plugin:jsx-a11y/recommended',
'prettier' // ESLint + Prettier 통합
],
// 파서 설정
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaFeatures: {
jsx: true
},
ecmaVersion: 2025,
sourceType: 'module',
project: './tsconfig.json'
},
// 플러그인
plugins: [
'react',
'react-hooks',
'@typescript-eslint',
'import',
'jsx-a11y',
'prettier'
],
// 규칙 설정
rules: {
// 오류 방지 규칙
'no-console': ['warn', { allow: ['warn', 'error'] }],
'no-unused-vars': 'off', // TypeScript 규칙으로 대체
'@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
'react/prop-types': 'off', // TypeScript 사용 시 불필요
'react/react-in-jsx-scope': 'off', // React 17+ 에서 불필요
// 가독성 개선 규칙
'react-hooks/rules-of-hooks': 'error',
'react-hooks/exhaustive-deps': 'warn',
'import/order': [
'error',
{
groups: [
'builtin',
'external',
'internal',
'parent',
'sibling',
'index'
],
'newlines-between': 'always',
alphabetize: { order: 'asc' }
}
],
// 접근성 규칙
'jsx-a11y/anchor-is-valid': 'warn',
// 코드 스타일 규칙
'prettier/prettier': ['error', {}, { usePrettierrc: true }]
},
// 특정 파일 패턴에 다른 규칙 적용
overrides: [
{
files: ['**/*.test.{ts,tsx}', '**/*.spec.{ts,tsx}'],
env: {
jest: true
},
rules: {
'@typescript-eslint/no-explicit-any': 'off'
}
}
],
// 특정 파일/폴더 무시
ignorePatterns: [
'node_modules',
'dist',
'build',
'*.config.js',
'public'
],
// 설정
settings: {
react: {
version: 'detect'
},
'import/resolver': {
typescript: {}
}
}
};
2. ESLint와 함께 Prettier 사용
// .prettierrc
{
"singleQuote": true,
"trailingComma": "es5",
"printWidth": 80,
"tabWidth": 2,
"semi": true,
"arrowParens": "avoid",
"bracketSpacing": true,
"endOfLine": "lf"
}
// package.json에 스크립트 추가
{
"scripts": {
"lint": "eslint src --ext .js,.jsx,.ts,.tsx",
"lint:fix": "eslint src --ext .js,.jsx,.ts,.tsx --fix",
"format": "prettier --write \"src/**/*.{js,jsx,ts,tsx,css,scss,md}\""
}
}
3. VSCode 통합
// .vscode/settings.json
{
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact"
],
"typescript.tsdk": "node_modules/typescript/lib"
}
4. Husky와 lint-staged로 자동화
# 설치
npm install --save-dev husky lint-staged
# Husky 설정
npx husky-init && npm install
// package.json
{
"scripts": {
"prepare": "husky"
},
"lint-staged": {
"*.{js,jsx,ts,tsx}": [
"eslint --fix",
"prettier --write"
],
"*.{json,css,scss,md}": [
"prettier --write"
]
}
}
# pre-commit 훅 생성
npx husky add .husky/pre-commit "npx lint-staged"
2025년 ESLint의 최신 기능:
- Flat Config: 설정 파일 간소화 및 성능 향상
- 개선된 타입스크립트 지원: 더 정확한 타입 기반 린팅
- 병렬 처리 최적화: 대규모 코드베이스에서 성능 향상
- New Linting Rules: 최신 JavaScript/TypeScript 기능에 대한 추가 규칙
3. TurboPack: 차세대 빌드 시스템 🚀
TurboPack은 Webpack 창시자가 개발한 Rust 기반 빌드 시스템으로, 특히 대규모 애플리케이션에서 놀라운 속도를 제공하며 Next.js와의 완벽한 통합으로 주목받고 있어요.
TurboPack의 주요 특징:
- 기존 빌드 도구보다 훨씬 빠른 속도 ⚡
- Rust 기반 엔진으로 극대화된 성능
- 메모리 효율적 증분 컴파일
- Next.js와의 통합 🔄
- Next.js 13부터 기본 빌드 엔진으로 선택 가능
- Next.js 기능과의 최적화된 호환성
- 스마트한 캐싱 💾
- 지역 및 원격 캐싱으로 빌드 시간 최소화
- 정확한 종속성 추적
- 확장성 📈
- 작은 프로젝트에서 대규모 모노레포까지 확장 가능
- 모듈 연합(Module Federation) 지원
// next.config.js에서 TurboPack 활성화
/** @type {import('next').NextConfig} */
const nextConfig = {
// TurboPack 활성화
experimental: {
turbo: true
}
};
module.exports = nextConfig;
TurboPack 사용법:
1. Next.js에서 TurboPack 사용
# 개발 서버 실행 시 TurboPack 활성화
next dev --turbo
# 또는 package.json 스크립트에 추가
{
"scripts": {
"dev": "next dev --turbo",
"build": "next build",
"start": "next start"
}
}
2. Turborepo와 함께 사용 (모노레포)
// turborepo.json
{
"$schema": "https://turborepo.org/schema.json",
"pipeline": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**", ".next/**", "!.next/cache/**"]
},
"lint": {
"outputs": []
},
"dev": {
"cache": false
},
"test": {
"dependsOn": ["build"],
"outputs": ["coverage/**"],
"inputs": ["src/**/*.tsx", "src/**/*.ts", "test/**/*.ts"]
}
},
"globalDependencies": [
"tsconfig.json"
]
}
3. 원격 캐싱 설정
# Vercel 원격 캐싱 설정
npx turbo login
npx turbo link
// package.json
{
"scripts": {
"build": "turbo run build",
"dev": "turbo run dev",
"lint": "turbo run lint"
}
}
4. 성능 최적화 옵션
// turbo.json에 성능 옵션 추가
{
"$schema": "https://turborepo.org/schema.json",
// ...
"globalEnv": ["NODE_ENV", "NEXT_PUBLIC_*"],
"experimentalSpaces": true,
// 병렬 작업 최대 개수
"concurrency": 10
}
2025년 TurboPack의 최신 기능:
- 증분 빌드 최적화: 초대형 프로젝트에서도 밀리초 단위 재빌드
- AI 기반 최적화: 사용 패턴 학습으로 더 효율적인 빌드 전략 제안
- WebAssembly 확장: Rust 외에도 다양한 언어로 플러그인 작성 가능
- 분산 빌드 시스템: 클라우드 기반 분산 컴파일 지원
세 가지 도구의 시너지: 개발 환경 끝판왕 👑
이 세 도구를 함께 사용하면 빠른 개발, 높은 코드 품질, 최적화된 빌드를 모두 얻을 수 있어요. 어떻게 통합하는지 살펴볼게요!
Next.js 프로젝트에 통합하기
# 프로젝트 생성
npx create-next-app@latest my-optimized-app --js
# ESLint 설정 강화
npm install --save-dev \
@typescript-eslint/eslint-plugin \
@typescript-eslint/parser \
eslint-plugin-import \
eslint-plugin-jsx-a11y \
eslint-plugin-react-hooks \
eslint-config-prettier \
prettier \
husky \
lint-staged
# 개발 서버 실행 (TurboPack 활성화)
npm run dev -- --turbo
package.json 스크립트 최적화
{
"scripts": {
"dev": "next dev --turbo",
"build": "next build",
"start": "next start",
"lint": "next lint",
"lint:fix": "next lint --fix",
"format": "prettier --write \"src/**/*.{js,jsx,ts,tsx,css,scss,md,json}\"",
"prepare": "husky install"
}
}
VSCode 최적화 설정
// .vscode/settings.json
{
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
"editor.defaultFormatter": "esbenp.prettier-vscode",
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact"
],
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"typescript.tsdk": "node_modules/typescript/lib",
"typescript.enablePromptUseWorkspaceTsdk": true,
"tailwindCSS.includeLanguages": {
"typescript": "javascript",
"typescriptreact": "javascript"
},
"tailwindCSS.experimental.classRegex": [
["cva\\(([^)]*)\\)", "[\"'`]([^\"'`]*).*?[\"'`]"]
]
}
성능 최적화 팁
1. TurboPack 캐시 활용
# 원격 캐시 사용
npx turbo login
npx turbo link
# 빌드 시 캐시 활용
npx turbo build
2. ESLint 성능 최적화
// .eslintrc.js
module.exports = {
// ...
// 캐시 활성화
cache: true,
cacheLocation: '.eslintcache',
// 불필요한 파일 무시
ignorePatterns: [
'node_modules',
'dist',
'.next',
'out',
'public',
'*.d.ts'
]
};
3. Vite 개발 서버 최적화
// vite.config.js
export default defineConfig({
// ...
server: {
// 파일 변경 감지 최적화
watch: {
usePolling: false,
ignored: ['**/node_modules/**', '**/.git/**']
},
// 메모리 사용량 최적화
fs: {
strict: true
},
// HMR 최적화
hmr: {
overlay: true
}
}
});
실전 적용 사례 💼
실제 프로젝트에서 이러한 도구들을 어떻게 활용할 수 있는지 살펴볼게요!
1. 대규모 e-커머스 프로젝트
// next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
// TurboPack 활성화
experimental: {
turbo: {
// 추가 TurboPack 설정
loaders: {
// SVG 로더 설정
'.svg': {
loader: '@svgr/webpack',
options: {
dimensions: false,
titleProp: true
}
}
}
}
},
// 이미지 최적화
images: {
domains: ['cdn.example.com'],
formats: ['image/avif', 'image/webp'],
minimumCacheTTL: 60
},
// 페이지별 번들 분석
webpack: (config, { isServer }) => {
// 프로덕션 빌드에서만 번들 분석기 활성화
if (!isServer && process.env.ANALYZE === 'true') {
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');
config.plugins.push(
new BundleAnalyzerPlugin({
analyzerMode: 'server',
openAnalyzer: true
})
);
}
return config;
}
};
module.exports = nextConfig;
ESLint 커스텀 규칙으로 비즈니스 로직 검증
// eslint-plugin-ecommerce/rules/no-direct-api-calls.js
module.exports = {
meta: {
type: 'suggestion',
docs: {
description: 'API 호출은 서비스 레이어를 통해서만 해야 합니다'
}
},
create(context) {
return {
CallExpression(node) {
// fetch, axios 등의 직접 API 호출 탐지
if (
node.callee.name === 'fetch' ||
(node.callee.object && node.callee.object.name === 'axios')
) {
// pages, components 디렉토리 내 파일이면서
// services 디렉토리가 아닌 경우 경고
const filePath = context.getFilename();
if (
(filePath.includes('/pages/') || filePath.includes('/components/')) &&
!filePath.includes('/services/')
) {
context.report({
node,
message: 'API 호출은 서비스 레이어(api.js, services/)를 통해서만 해야 합니다'
});
}
}
}
};
}
};
2. SPA 프로젝트에 Vite 활용
// vite.config.js
import { defineConfig, splitVendorChunkPlugin } from 'vite';
import react from '@vitejs/plugin-react';
import { VitePWA } from 'vite-plugin-pwa';
import svgr from 'vite-plugin-svgr';
export default defineConfig({
plugins: [
react(),
svgr(), // SVG를 React 컴포넌트로 가져오기
splitVendorChunkPlugin(), // 벤더 청크 분리
VitePWA({
// PWA 설정
registerType: 'autoUpdate',
includeAssets: ['favicon.ico', 'robots.txt', 'apple-touch-icon.png'],
manifest: {
name: '내 SPA 앱',
short_name: 'SPA App',
theme_color: '#ffffff',
icons: [
{
src: '/android-chrome-192x192.png',
sizes: '192x192',
type: 'image/png'
},
{
src: '/android-chrome-512x512.png',
sizes: '512x512',
type: 'image/png'
}
]
},
workbox: {
// 캐싱 전략
runtimeCaching: [
{
urlPattern: /^https:\/\/api\.example\.com\/.*/i,
handler: 'NetworkFirst',
options: {
cacheName: 'api-cache',
expiration: {
maxEntries: 50,
maxAgeSeconds: 60 * 60 * 24 // 24시간
}
}
},
{
urlPattern: /\.(?:png|jpg|jpeg|svg|gif)$/,
handler: 'CacheFirst',
options: {
cacheName: 'images-cache',
expiration: {
maxEntries: 60,
maxAgeSeconds: 60 * 60 * 24 * 30 // 30일
}
}
}
]
}
})
],
// Vite 개발 서버 설정
server: {
port: 3000,
host: true, // 네트워크에서 접근 가능
hmr: {
overlay: true
}
},
// 빌드 최적화 설정
build: {
target: 'es2020',
outDir: 'dist',
assetsDir: 'assets',
sourcemap: process.env.NODE_ENV === 'development',
// 번들 최적화
rollupOptions: {
output: {
manualChunks: {
vendor: ['react', 'react-dom', 'react-router-dom'],
ui: ['@mui/material', '@emotion/react', '@emotion/styled'],
utils: ['lodash', 'date-fns']
}
}
},
// CSS 최적화
cssCodeSplit: true,
minify: 'terser',
terserOptions: {
compress: {
drop_console: process.env.NODE_ENV === 'production',
drop_debugger: process.env.NODE_ENV === 'production'
}
}
}
});
개발 도구 선택의 가이드라인 💡
프로젝트의 특성에 따라 적합한 도구를 선택하는 것이 중요해요. 몇 가지 가이드라인을 제시해볼게요!
프로젝트 규모별 추천:
소규모 프로젝트:
- 빌드 도구: Vite (빠른 개발 경험)
- lint 구성: 기본 ESLint + Prettier
- CI/CD: GitHub Actions 간단 설정
중간 규모 프로젝트:
- 빌드 도구: Vite 또는 Next.js + TurboPack
- lint 구성: 확장된 ESLint + 커스텀 규칙 + Husky
- CI/CD: 캐시 활용 빌드 파이프라인
대규모 프로젝트/모노레포:
- 빌드 도구: Next.js + TurboPack + Turborepo
- lint 구성: 팀 맞춤형 ESLint 구성 + 자동화된 코드 리뷰
- CI/CD: 분산 빌드 + 원격 캐싱
성능 최적화 체크리스트:
- 개발 환경 최적화
- Node.js 최신 버전 사용 (v20+)
- pnpm 또는 yarn berry 사용으로 의존성 설치 시간 단축
- TypeScript 증분 컴파일 활성화
- 빌드 시간 최적화
- 캐시 활용 (로컬 및 원격)
- 불필요한 플러그인 최소화
- 트리 쉐이킹 활성화
- 번들 크기 최적화
- 코드 분할 전략 수립
- 동적 임포트 활용
- 번들 분석기로 큰 의존성 식별 및 대체
마무리 🎁
Vite, ESLint, TurboPack은 모던 프론트엔드 개발 환경의 강력한 삼총사라고 할 수 있어요. 이 도구들은 각각의 영역에서 뛰어난 성능과 개발자 경험을 제공하며, 함께 사용했을 때 시너지 효과를 극대화할 수 있답니다.
- Vite: 빠른 개발 서버와 최적화된 빌드로 개발 속도 향상
- ESLint: 코드 품질 관리와 일관성 있는 코드베이스 유지
- TurboPack: 대규모 애플리케이션에서도 빠른 빌드와 효율적인 캐싱
기술은 계속 발전하지만, 좋은 도구를 선택하는 원칙은 변함없습니다. 개발자 경험, 성능, 팀의 생산성을 모두 고려해 프로젝트에 맞는 도구를 선택하세요. 그리고 도구에 너무 얽매이지 말고, 문제 해결과 가치 창출에 집중하는 것이 진정한 개발자의 자세임을 기억해주세요!
'개발' 카테고리의 다른 글
프론트 필수 라이브러리 모음 : 14화. 팀 규모별 라이브러리 추천 조합 🧩✨ (0) | 2025.04.30 |
---|---|
프론트 필수 라이브러리 모음 : 13화 통합 라이브러리 비교 표 🧩✨ (0) | 2025.04.29 |
프론트 필수 라이브러리 모음 : 11화. NextAuth.js, Clerk - 인증 솔루션🧩✨ (0) | 2025.04.27 |
프론트 필수 라이브러리 모음 : 10화 Jest, React Testing Library, Cypress - 테스트 자동화🧩✨ (0) | 2025.04.26 |
프론트 필수 라이브러리 모음 : 9화. Lodash, Day.js, Lucide - 유용한 유틸리티 모음 🧩✨ (0) | 2025.04.25 |