Babel에서 SWC로 전환해 Next.js 빌드 시간 66% 줄이기
결과: Babel에서 SWC로 전환하고 번들을 정리해 빌드 시간을 235.81초에서 80.32초로 66% 줄였다. GitHub Actions 빌드는 약 6분에서 약 3분으로 줄었다.
문제 상황
- 로컬 빌드에 약 4분, GitHub Actions 빌드에 약 6분이 걸렸다
- 빌드가 CI/CD 파이프라인의 병목이 되었다
원인 분석
빌드 로그 확인 결과
info - Disabled SWC as replacement for Babel because of custom Babel configuration ".babelrc"
주요 문제점:
- .babelrc 파일로 인한 SWC 비활성화
- 738MB 크기의 node_modules
- 1MB 이상의 대용량 번들
- 200개 이상 페이지의 SSR 설정
해결 과정
1. SWC 컴파일러 활성화
rm -f .babelrc
// next.config.js
const nextConfig = {
// SWC 강제 활성화
swcMinify: true,
// 빌드 최적화
experimental: {
forceSwcTransforms: true,
},
// 컴파일러 최적화
compiler: {
removeConsole: process.env.NODE_ENV === "production",
},
};
2. JSX 문법 오류 수정
- SWC 전환 후 문법 오류 발견하여 수정
// 수정 전
<Box style={{ margin: "0px 20px" }}>-></Box>
// 수정 후
<Box style={{ margin: "0px 20px" }}>→</Box>
3. 번들 최적화
- 웹팩 청크 분할 설정
webpack: (config, { dev }) => {
if (!dev) {
config.optimization = {
...config.optimization,
splitChunks: {
chunks: 'all',
cacheGroups: {
vendor: {
test: /[\\\\\\\\/]node_modules[\\\\\\\\/]/,
name: 'vendors',
priority: 10,
},
mui: {
test: /[\\\\\\\\/]node_modules[\\\\\\\\/]@material-ui[\\\\\\\\/]/,
name: 'mui',
priority: 20,
},
},
},
};
}
}
ETC. 추가 개선사항
- 번들 분석 도구 추가
npm install --save-dev @next/bundle-analyzer
지속적 모니터링을 위한 npm run analyze 명령어 지원.
요약
1. **SWC 컴파일러 활성화**
- .babelrc 파일 제거
- next.config.js에 forceSwcTransforms 적용
- JSX 문법 오류 수정
2. **번들 최적화**
- vendor/mui 청크 분리
- 프로덕션 console.log 제거
- 코드 스플리팅 개선
결과
개선 전
- local build (약 4분 소요)

- github action 내 build (약 6분 소요)

개선 후
- local build (약 1분30초 소요)

- github action 내 build (약 3분 소요)

분석
| 항목 | 개선 전 | 개선 후 | 개선 비율 |
|---|---|---|---|
| 총 빌드 시간 | 235.81초 | 80.32초 | -66% (2.9배 빠름) |
| User Time | 31.41초 | 18.13초 | -42% 개선 |
| CPU 사용률 | 241% | 254% | +5% 증가 |
| 총 CPU 시간 | 110.62초 | 38.63초 | -65% 개선 |
| 컴파일러 | Babel | SWC | - |
| 번들 분석 | 미지원 | 지원 | - |
