Next.js 개발 캐시가 맥 용량을 먹는 이유와 정리법
Next.js 16의 .next/dev 개발 캐시가 계속 쌓이는 이유와 16.4의 turbopackGc, 그리고 Turborepo가 그 캐시를 빌드마다 복사해 불리는 문제를 실측으로 정리했습니다.

시작하며
어느 날 맥 여유 공간이 1.7GB까지 떨어졌습니다. 범인을 찾아보니 Next.js 모노레포 하나에 캐시만 100GB 가까이 쌓여 있었습니다(2026년 9월 기준).
| 위치 | 용량 |
|---|---|
apps/web/.next/dev | 18GB |
apps/web-en/.next/dev | 8.5GB |
.turbo/cache | 73GB |
원인은 두 가지였습니다.
- Next.js 개발 캐시(
.next/dev)가 지워지지 않고 계속 쌓인다 - Turborepo가 빌드할 때마다 그 개발 캐시를 통째로 복사해 보관한다
이 글에서는 두 문제가 왜 생기는지, 어떻게 정리하는지를 직접 측정한 숫자와 함께 정리합니다.
빌드 캐시(.next/cache)가 계속 커지는 문제는 예전부터 있었고 GitHub Actions CI/CD 글에서도 다뤘습니다.
이번에는 Next.js 16에서 새로 생긴 .next/dev가 중심입니다.
Next.js 16.4.2, Turborepo 2.11.7 기준입니다.
Next.js 16의 .next 폴더 구조
먼저 .next 안에 무엇이 있는지부터 보겠습니다.
Next.js 16부터 개발 서버 결과물과 빌드 결과물이 다른 경로로 나뉘었습니다.
| 경로 | 만드는 명령 | 언제 쓰이나 |
|---|---|---|
.next/dev | next dev | 개발 서버에서만 |
.next/dev/cache/turbopack | next dev | 개발 서버를 다시 켤 때 컴파일 결과 재사용 |
.next/server, .next/static | next build | 실제 서비스(next start, 배포) |
.next/cache/turbopack | next build | 다음 빌드를 빠르게 하려고 |
.next/dev는 개발할 때만 쓰이고, 빌드나 실제 서비스에는 전혀 쓰이지 않습니다.
개발 서버를 켜 둔 채로 빌드할 수 있게 된 것도 이 분리 덕분입니다.
캐시와 관련된 변화를 버전별로 정리하면 이렇습니다.
| 버전 | 바뀐 것 |
|---|---|
| 16.0 | 개발 결과물을 .next/dev로 분리 |
| 16.1 | 개발 서버 디스크 캐시가 기본으로 켜짐 |
| 16.3 | 빌드 디스크 캐시도 기본으로 켜짐 |
| 16.4 | 캐시 정리 옵션 turbopackGc 추가 (실험 기능) |
문제 1. 개발 캐시가 계속 쌓인다
왜 쌓이나
Next.js 16.1부터 개발 서버는 컴파일 결과를 .next/dev/cache/turbopack에 저장합니다.
개발 서버를 껐다 켜도 처음부터 컴파일하지 않으려는 것입니다.
문제는 안 쓰는 결과를 지우는 기능이 없었다는 점입니다. 지운 페이지, 고치기 전 코드의 결과도 그대로 남아서 개발할수록 커지기만 합니다.
16.3부터 기본으로 켜진 빌드 캐시(.next/cache/turbopack)도 같은 구조라, 빌드할수록 커집니다.
실제로 같은 프로젝트에서 비교해 보면 차이가 큽니다.
| 상태 | 개발 캐시 |
|---|---|
| 캐시를 비우고 같은 페이지들을 다시 열었을 때 | 312MB |
| 16.3.8에서 개발하며 쌓인 캐시 | 2.4GB |

버전을 올리면 예전 캐시가 남는다
하나 더 놓치기 쉬운 점이 있습니다. 이 캐시는 Next.js 버전마다 폴더를 따로 만듭니다.
.next/dev/cache/turbopack/
├── v16.3.8-b0fad0d4 2.4GB ← 업그레이드 전 캐시, 그대로 남음
└── v16.4.2-2864b177 312MB ← 지금 쓰는 캐시새 버전은 예전 폴더를 읽지도, 지우지도 않습니다.
빌드 캐시(.next/cache/turbopack)도 같은 방식으로 버전별 폴더가 생깁니다.
업그레이드했다면 지금 버전이 아닌 폴더는 지워도 됩니다.
# 버전별 폴더 크기 확인
du -sh .next/dev/cache/turbopack/* .next/cache/turbopack/*
# 지금 버전이 아닌 폴더 삭제 (예시)
rm -rf .next/dev/cache/turbopack/v16.3.8-* .next/cache/turbopack/v16.3.8-*.next를 통째로 지워도 다음 실행 때 다시 만들어집니다. 첫 실행만 조금 느려집니다.
해결 - turbopackGc (16.4+)
Next.js 16.4에서 캐시를 정리하는 옵션이 실험 기능으로 추가됐습니다.
// next.config.mjs
const nextConfig = {
experimental: {
// 쓰이지 않는 Turbopack 캐시를 메모리·디스크에서 정리 (16.4+)
turbopackGc: true,
},
}
export default nextConfig공식 문서상 이 옵션은 next dev와 next build 모두에 적용됩니다.
개발 캐시와 빌드 캐시가 함께 정리된다는 뜻입니다.
단 Turbopack을 쓸 때만이고, webpack으로 빌드할 때 쓰는 .next/cache/webpack은 대상이 아닙니다.
켜면 동작이 이렇게 바뀝니다.
| 끈 상태 (기본값) | 켠 상태 | |
|---|---|---|
| 새로 컴파일한 결과 | 캐시에 추가 | 캐시에 추가 |
| 지금 안 쓰이는 결과 | 계속 남음 | 일정 기간 안 쓰이면 삭제 |
| 삭제 기준 | 없음 | 기본 3일 (rootTtlMs로 조절) |
| 예전 버전 폴더 | 남음 | 남음 (같은 버전 폴더 안만 정리) |
먼저 들어온 순서대로 지우는 게 아니라 안 쓰인 것만 지웁니다. 자주 여는 페이지의 캐시는 남고, 지운 페이지나 바뀐 코드의 결과가 빠지는 식입니다.
간단히 확인해 봤습니다. 임시 페이지를 만들어 열고, 지운 뒤 개발 서버를 다시 켜면서 캐시 크기를 쟀습니다. 효과를 바로 보려고 삭제 기준을 10초로 줄였습니다.
| 세션 | GC 끔 | GC 켬 |
|---|---|---|
| 1. 임시 페이지 포함 | 297MB | 297MB |
| 2. 임시 페이지 삭제 후 | 304MB | 287MB |
| 3. 한 번 더 | 309MB | 292MB |
끈 상태에서는 지운 페이지의 캐시가 남은 채로 계속 늘었고, 켠 상태에서는 그 몫이 회수됐습니다.
다만 실험 기능이라 동작이 바뀔 수 있고, 오래 안 연 페이지는 다음에 열 때 다시 컴파일합니다. 디스크가 정말 부족하다면 개발 캐시를 아예 끄는 방법도 있습니다.
experimental: {
turbopackFileSystemCacheForDev: false,
}대신 개발 서버를 켤 때마다 처음부터 컴파일해서 느려집니다.
문제 2. Turborepo가 개발 캐시를 빌드마다 복사한다
이름이 비슷해서 헷갈리기 쉬운데, 둘은 다른 도구입니다.
| Turbopack | Turborepo | |
|---|---|---|
| 무엇 | Next.js 안의 번들러 | 모노레포 작업 실행기 |
| 캐시 위치 | .next/dev/cache/turbopack | 저장소 루트 .turbo/cache |
이번 문제는 Turborepo 쪽이고, 앞에서 본 73GB가 여기서 나왔습니다.
왜 생기나
Next.js 모노레포의 turbo.json에는 보통 이런 설정이 들어 있습니다.
{
"tasks": {
"build": {
"outputs": [".next/**", "!.next/cache/**"]
}
}
}"빌드가 끝나면 .next 안의 파일을 전부 압축해 보관하되, .next/cache는 빼라"는 뜻입니다.
.next/cache를 빼는 이유는 앞에서 본 것처럼 빌드 캐시가 계속 커지기 때문입니다.
next build는 시작할 때 .next를 비우는데, 이때 남기는 폴더가 버전마다 다릅니다.
// Next.js 15 - cache 만 남기고 지운다
recursiveDelete(distDir, /^cache/)
// Next.js 16 - cache 와 함께 dev 도 남긴다
recursiveDeleteSyncWithAsyncRetries(distDir, new Set([
'cache', 'dev', 'diagnostics', 'lock', 'trace',
]))Next.js 15에서는 개발 서버 결과물이 빌드할 때 지워졌고, 개발용 컴파일 캐시는 .next/cache 안에 있어서 이미 빠져 있었습니다.
Next.js 16에서는 개발 캐시가 새 폴더 .next/dev로 옮겨졌고, 빌드도 이 폴더를 지우지 않습니다.
| 폴더 | 빌드 후 남나 | Turborepo가 압축하나 | 결과 |
|---|---|---|---|
.next/cache | 남음 | 빠짐 (!.next/cache/**) | 그 자리에서만 커짐 |
.next/dev | 남음 | 포함 (.next/**) | 빌드마다 복사본이 쌓임 |
그래서 개발 서버를 쓰다가 로컬에서 빌드하면, 쓰이지도 않는 개발 캐시까지 압축돼 .turbo/cache에 하나씩 쌓입니다.
오래된 압축 파일은 자동으로 지워지지 않습니다.

.turbo/cache에 있던 압축 파일 하나(3.8GB)를 열어 보니 이랬습니다.
| 안에 든 것 | 크기 (압축 전) |
|---|---|
.next/dev (개발 캐시) | 6,183MB |
.next/server, static 등 (실제 빌드 결과) | 75MB |
압축 파일 68개 전체로 봐도 압축 전 기준 98%가 개발 캐시였습니다.
해결 - 한 줄 추가
outputs에서 .next/dev를 빼면 됩니다.
{
"tasks": {
"build": {
"outputs": [".next/**", "!.next/cache/**", "!.next/dev/**"]
}
}
}같은 모노레포에서 직접 빌드해 비교했습니다.
| 빌드 | 상황 | 새로 생긴 캐시 |
|---|---|---|
| A | 원래 설정 | 3.6GB |
| B | !.next/dev/** 추가 후 전체 다시 빌드 | 28MB |
| C | B 설정에서 앱 하나만 코드를 바꿔 빌드 | 12.3MB |
B의 압축 파일에도 빌드 결과(server, static 등)는 빠짐없이 들어 있고, 개발 캐시만 빠졌습니다.
빌드 결과는 매번 전체가 새로 저장되지만 앱당 10MB 남짓이라 부담이 없습니다.
공식 템플릿은 이미 고쳐졌다
이 문제는 Turborepo 저장소에도 보고됐고, 2026년 6월 공식 문서와 create-turbo 템플릿에 !.next/dev/**가 추가됐습니다(Turborepo 2.9.17).
하지만 그 전에 만든 프로젝트의 turbo.json은 예전 설정 그대로입니다.
Turborepo 버전을 올려도 자동으로 바뀌지 않으니 직접 확인해야 합니다.
이미 쌓인 .turbo/cache는 지워도 될까
지워도 됩니다. Turborepo는 패키지마다 입력(코드·설정)으로 해시를 만들고, 같은 해시일 때만 캐시를 꺼내 씁니다. 고친 앱은 매번 해시가 바뀌니 예전 캐시는 거의 다시 쓰이지 않습니다. 실제로 현재 코드 상태로 해시를 계산해 보니 쌓여 있던 68개 중 맞는 것이 하나도 없었습니다.
rm -rf .turbo/cache참고로 Vercel에서 하는 빌드는 next dev를 실행하지 않아 .next/dev가 없으므로 이 문제가 없습니다.
다만 Turborepo 원격 캐시를 쓰고 있다면, 로컬 빌드 결과가 원격으로 올라가면서 개발 캐시도 같이 올라갈 수 있으니 함께 확인해 보세요.
한 번에 점검하기
AI 코딩 도구에 아래 프롬프트를 붙여 넣으면 두 문제를 한 번에 점검할 수 있습니다.
내 작업 폴더의 Next.js 프로젝트들을 점검해 줘.
1. 프로젝트마다 .next/dev 용량과 .next/dev/cache/turbopack 아래 버전별 폴더 크기를 표로 보여 줘.
지금 설치된 Next.js 버전이 아닌 폴더는 지워도 되는지 알려 줘.
2. Next.js 16.4 이상이면 next.config 에 experimental.turbopackGc 를 켜는 방법을 알려 줘.
3. turbo.json 이 있으면 Next.js 앱의 build outputs 에 "!.next/dev/**" 가 있는지 확인하고,
없으면 추가해 줘. .turbo/cache 용량도 알려 줘.마무리
정리하면 이렇습니다.
| 대상 | 문제 | 해결 |
|---|---|---|
| Next.js 16 (모든 프로젝트) | 개발 캐시(.next/dev)와 빌드 캐시(.next/cache)가 계속 쌓임 | 16.4의 turbopackGc, 업그레이드 후 예전 버전 폴더 삭제 |
| Next.js 16 + Turborepo | 빌드할 때마다 개발 캐시가 .turbo/cache로 복사됨 | outputs에 "!.next/dev/**" 추가, 쌓인 캐시 삭제 |
빌드 캐시가 커지는 건 예전부터였지만, Next.js 16에서 개발 캐시가 .next/dev로 옮겨지고 기본으로 켜지면서 문제가 훨씬 커졌습니다.
개발 서버를 오래 켜 두는 분이라면, 특히 모노레포를 쓰는 분이라면 한 번쯤 .next와 .turbo 폴더 용량을 확인해 보시길 추천합니다.
참고자료
- Next.js 16.4 (Next.js 블로그)
- turbopackGc (Next.js 문서)
- Turbopack FileSystem Caching (Next.js 문서)
- vercel/turborepo#13018 - Docs: example for nextjs build task includes dev server
- vercel/turborepo#13019 - docs: Exclude Next.js dev server output from cache examples
- .next folder is bigger in Next.js 16 (Next.js Discussion)