[이제와서 시작하는 Next.js 마스터하기 #13] Turbopack으로 개발 루프 개선
“변경하고 확인하는 시간을 줄이면 개발 리듬이 달라집니다.” - Turbopack으로 Next.js 개발 루프를 점검해봅니다.
🎯 이 글에서 배울 내용
- Turbopack이 무엇인지
- Webpack vs Turbopack 비교
- Turbopack 활성화 방법
- 성능 최적화 팁
- 마이그레이션 시 확인할 호환성 기준
예상 소요 시간: 25분 난이도: 초급
⚡ Turbopack이란?
Rust로 작성된 Next.js 내장 번들러입니다. Next.js 16에서는 Turbopack이 기본 번들러 흐름에 포함되며, 개발 서버와 빌드 모두에서 사용할 수 있습니다.
Webpack은 여전히 중요한 생태계 자산이지만, Turbopack은 Next.js 앱의 서버/클라이언트 그래프를 한 번에 이해하도록 설계되어 Fast Refresh와 빌드 시간을 줄이는 데 초점을 둡니다.
Turbopack은 타입 체크 도구가 아닙니다. JavaScript와 TypeScript 변환은 처리하지만, 타입 오류는 IDE, tsc --noEmit, 또는 CI의 별도 스크립트로 확인해야 합니다.
속도 비교
1
2
3
4
5
6
Webpack: ████████████████████ 60초
Turbopack: ██ 12초 (5배 빠름!)
Fast Refresh:
Webpack: ███ 3초
Turbopack: < 1초 (10배 빠름!)
실제 속도는 프로젝트 규모, 플러그인, Babel 설정, CSS 처리 방식에 따라 달라집니다. 따라서 “무조건 몇 배 빠르다”로 기억하기보다, 현재 프로젝트에서 next dev와 next build 시간을 직접 비교하는 습관이 좋습니다.
🚀 Turbopack 사용하기
1. 개발 모드
1
2
3
4
5
# Next.js 16 새 프로젝트는 기본적으로 Turbopack 흐름을 사용합니다.
npm run dev
# Webpack으로 비교 실행이 필요할 때
npx next dev --webpack
2. 프로덕션 빌드 (Next.js 16)
1
2
3
4
npm run build
# Webpack으로 fallback 비교
npx next build --webpack
🔧 설정
Turbopack 설정은 next.config.ts의 turbopack 키에서 관리합니다. 예전 Next.js 13-15.2 계열에서 쓰던 experimental.turbo는 Next.js 16 기준으로 turbopack으로 옮겨야 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// next.config.ts
import type { NextConfig } from 'next';
const nextConfig: NextConfig = {
turbopack: {
rules: {
'*.svg': {
loaders: ['@svgr/webpack'],
as: '*.js',
},
},
},
};
export default nextConfig;
CSS, PostCSS, 최신 JavaScript 변환 같은 기본 기능은 별도 loader 설정 없이 동작합니다. 위 예시처럼 loader를 추가하는 경우는 SVG를 React 컴포넌트로 가져오는 등 특별한 변환이 필요할 때로 제한하세요.
경로 alias도 turbopack.resolveAlias로 관리할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// next.config.ts
import type { NextConfig } from 'next';
const nextConfig: NextConfig = {
turbopack: {
resolveAlias: {
'@components': './src/components',
'@lib': './src/lib',
},
resolveExtensions: ['.mdx', '.tsx', '.ts', '.jsx', '.js', '.json'],
},
};
export default nextConfig;
tsconfig.json의 paths만으로 충분한 프로젝트라면 중복 설정을 만들 필요는 없습니다. 빌드 도구별 alias가 서로 어긋나면 개발 서버는 되는데 테스트나 Storybook이 깨지는 식의 문제가 생길 수 있습니다.
Webpack 설정이 남아 있다면?
커스텀 Webpack 플러그인을 많이 쓰는 프로젝트는 한 번에 바꾸기보다 다음 순서로 점검하세요.
next dev로 기본 동작을 확인합니다.- 빌드가 깨지면
next dev --webpack으로 기존 동작과 비교합니다. - SVG, MDX, Sass, 경로 alias 같은 자주 쓰는 설정부터 Turbopack 호환 여부를 확인합니다.
- 팀 CI에는
next build시간을 기록해 변경 전후 차이를 남깁니다.
다음 항목이 있다면 더 신중하게 봐야 합니다.
| 점검 항목 | 확인할 것 |
|---|---|
webpack() 설정 | Turbopack에서는 그대로 적용되지 않으므로 turbopack 설정으로 옮길 수 있는지 확인 |
| 커스텀 Sass 함수 | Rust 기반 처리와 맞지 않을 수 있어 Webpack fallback 필요 여부 확인 |
| 특수 loader | @svgr/webpack, yaml-loader처럼 필요한 loader만 최소 적용 |
| monorepo 링크 패키지 | 파일 시스템 root 감지가 맞는지, 필요하면 turbopack.root 검토 |
| Yarn PnP | Turbopack 지원 계획이 없는 영역이므로 패키지 매니저 전략 확인 |
📊 성능 측정
1
2
3
4
5
# 빌드 시간 측정
time npx next build
# 개발 서버 시작 시간
time npx next dev
더 정확한 비교를 하려면 .next 폴더를 지운 첫 실행과, 캐시가 쌓인 두 번째 실행을 나눠서 봅니다.
1
2
3
rm -rf .next
time npx next build
time npx next build
개발 서버 성능이나 메모리 이슈를 보고해야 한다면 Turbopack trace를 남길 수 있습니다.
1
NEXT_TURBOPACK_TRACING=1 npx next dev
이 명령은 .next/dev/trace-turbopack 파일을 생성합니다. 팀 내부 기록이나 GitHub 이슈를 만들 때 재현 경로, Node 버전, 패키지 매니저, trace 파일을 함께 남기면 원인 파악이 빨라집니다.
확인할 지표:
- 개발 서버 첫 준비 시간
- Fast Refresh 반영 시간
- 프로덕션 빌드 전체 시간
- CI에서 TypeScript, lint, page generation이 각각 차지하는 시간
- Webpack 전용 플러그인 때문에 fallback이 필요한 영역
- 타입 체크와 lint가 빌드 시간에서 차지하는 비중
🧪 실습: 프로젝트에서 비교하기
- 현재 프로젝트의
next dev시작 시간을 기록합니다. - 작은 컴포넌트를 수정하고 Fast Refresh 시간을 확인합니다.
next build결과에서 단계별 소요 시간을 확인합니다.--webpack옵션으로 한 번 더 실행해 차이를 비교합니다.- 차이가 큰 경우 README나 팀 문서에 기준 명령어를 남깁니다.
Turbopack은 “설정 하나로 끝”이라기보다, 팀의 개발 루프를 얼마나 짧게 만드는지 확인할 때 가치가 잘 드러납니다.
마이그레이션 체크리스트
experimental.turbo를 쓰고 있다면turbopack키로 옮겼는가?- Webpack 전용 플러그인이 남아 있다면 대체 설정 또는 fallback 기준을 정했는가?
tsc --noEmit또는next build외 타입 체크 명령을 CI에서 돌리는가?.next삭제 후 첫 빌드와 캐시 빌드 시간을 분리해 기록했는가?next dev --webpack,next build --webpack으로 비교 가능한 기준을 남겼는가?- SVG/MDX/Sass처럼 팀에서 자주 쓰는 변환이 실제 화면에서 동작하는가?
🎯 오늘 배운 내용 정리
- Turbopack
- Rust 기반 Next.js 내장 번들러
- 개발 서버와 프로덕션 빌드에서 안정화
- 프로젝트에 따라 속도 차이가 다르므로 직접 측정 필요
- 운영 팁
- 기본은
next dev,next build - 비교나 fallback이 필요하면
--webpack - 커스텀 Webpack 설정은 Turbopack 호환성을 따로 점검
- 타입 체크와 lint는 별도 검증 단계로 유지
- 기본은
📚 시리즈 네비게이션
“Turbopack의 가치는 숫자로 확인한 짧아진 피드백 루프에서 드러납니다.” ⚡
