Windows에서 Next.js Dev 환경 성능 개선 가이드
Windows + Next.js 16 + VSCode 환경에서 dev 서버와 TypeScript Server가 CPU·메모리를 과도하게 사용하는 문제를 해결하기 위한 5가지 방법.
영향 큰 순서: 1번 > 4번 > 3번 > 5번 > 2번
1. Windows Defender 실시간 스캔 제외 — 가장 효과 큼
왜 효과가 큰가
Defender는 파일이 읽히거나 쓰일 때마다 실시간 검사를 수행한다. node_modules는 파일이 수만 개, .next/cache는 빌드할 때마다 다시 쓰여서 dev 서버 시간의 30~50%를 Defender 검사가 차지하는 경우가 흔하다.
실행 방법 (관리자 권한 PowerShell)
Windows 시작 → "PowerShell" 검색 → 우클릭 → "관리자 권한으로 실행"
# 1) 프로젝트 폴더 제외
Add-MpPreference -ExclusionPath "c:\dev\decozip"
# 2) Node.js 프로세스 제외
Add-MpPreference -ExclusionProcess "node.exe"
# (선택) 3) npm 글로벌 폴더도 제외하면 npm install 도 빨라짐
Add-MpPreference -ExclusionPath "$env:APPDATA\npm"
Add-MpPreference -ExclusionPath "$env:APPDATA\npm-cache"
확인 방법
Get-MpPreference | Select-Object -ExpandProperty ExclusionPath
Get-MpPreference | Select-Object -ExpandProperty ExclusionProcess
방금 추가한 경로/프로세스가 보이면 성공.
되돌리는 법
Remove-MpPreference -ExclusionPath "c:\dev\decozip"
Remove-MpPreference -ExclusionProcess "node.exe"
주의
- 회사 PC는 IT 정책으로 막혀 있을 수 있음 (
Add-MpPreference 호출 시 권한 에러).
- 보안상 "신뢰할 수 있는 코드만 들어가는 폴더"만 제외할 것.
2. 좀비 Node 프로세스 정리
왜 필요한가
npm run dev 실행 후 터미널 X 버튼이나 VSCode 창을 그냥 닫으면 자식 node 프로세스가 백그라운드에 남는다. 누적되면 메모리 2~4GB씩 잡고 있어도 모를 수 있다.
현재 상태 확인 (일반 PowerShell)
Get-Process node -ErrorAction SilentlyContinue |
Select-Object Id, @{n='MemMB';e={[math]::Round($_.WS/1MB,1)}}, CPU, StartTime |
Sort-Object MemMB -Descending
출력 예시:
Id MemMB CPU StartTime
-- ----- --- ---------
12345 892.3 145.2 2026-06-10 09:15:22 ← 살아있는 dev 서버
67890 1340.1 320.0 2026-06-08 11:20:01 ← 이틀 전 좀비!
StartTime이 며칠 전이면 좀비.
좀비 죽이기
# 전부 죽이기 (현재 실행 중인 dev 서버도 같이 죽음 — 주의)
Stop-Process -Name node -Force
# 특정 PID만 죽이기
Stop-Process -Id 67890 -Force
습관 만들기
- dev 서버 종료는 항상 터미널에서 Ctrl+C.
- 하루 작업 끝낼 때
Get-Process node 한 번 돌려서 확인.
3. Dev 서버 메모리 상한 설정
왜 필요한가
Next.js dev 서버는 시간이 지나면서 메모리가 야금야금 쌓인다 (HMR 캐시, 모듈 그래프). 상한을 두면 메모리가 너무 많이 차기 전에 OOM으로 죽고, 그때 재시작하면 깔끔해진다.
실행 방법
cross-env 패키지 설치 (Windows에서 환경변수 inline 설정용):
cd c:\dev\decozip\frontend
npm install -D cross-env
package.json의 scripts.dev 수정:
"scripts": {
"dev": "cross-env NODE_OPTIONS=--max-old-space-size=2048 next dev",
"build": "next build",
"start": "next start",
"lint": "eslint"
}
2048 = 2GB. PC RAM이 16GB 이상이면 3072(3GB)도 OK.
- 너무 낮게 (예: 1024) 잡으면 빌드 중에도 죽으니 2048~3072 권장.
동작 확인
dev 서버 띄우고 작업하다가 메모리 한계 도달 시 콘솔에 다음과 같이 뜸:
<--- Last few GCs --->
FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
이때 그냥 npm run dev 다시 실행하면 됨.
cross-env 없이 하는 법
PowerShell에서만 쓴다면:
$env:NODE_OPTIONS = "--max-old-space-size=2048"
npm run dev
(터미널 닫으면 사라지니 매번 입력해야 함 → cross-env 권장)
4. VSCode TypeScript Server 메모리 제한
왜 필요한가
VSCode가 별도로 띄우는 tsserver 프로세스가 큰 프로젝트에서 2~3GB 차지한다. dev 서버와 별개로 동작하므로 따로 제한해야 한다.
실행 방법
프로젝트 루트(c:\dev\decozip)에 .vscode/settings.json 파일이 있는지 확인. 없으면 만들고, 있으면 다음 항목을 추가:
{
"typescript.tsserver.maxTsServerMemory": 2048,
"typescript.tsserver.watchOptions": {
"watchFile": "useFsEvents",
"watchDirectory": "useFsEvents",
"fallbackPolling": "dynamicPriority"
},
"files.watcherExclude": {
"**/node_modules/**": true,
"**/.next/**": true,
"**/dist/**": true,
"**/build/**": true
},
"search.exclude": {
"**/node_modules": true,
"**/.next": true
}
}
maxTsServerMemory: tsserver 메모리 상한 (MB).
watchOptions: Windows에서 파일 감시 방식을 가벼운 것으로.
files.watcherExclude: node_modules와 .next 변화를 감시 대상에서 제외 (가장 큰 효과).
적용 확인
VSCode 우하단 상태바의 TypeScript 5.x.x 클릭 → "Restart TS Server" 한 번 누르면 새 설정으로 재시작.
작업 관리자에서 Code.exe / tsserver.exe 메모리 사용량 감소 확인.
TS Server가 갑자기 느려질 때
명령 팔레트(Ctrl+Shift+P) → "TypeScript: Restart TS Server" → 즉시 회복.
5. 주기적 dev 서버 + .next 폴더 청소
왜 필요한가
.next 폴더는 dev 빌드 캐시·HMR 청크·소스맵을 누적한다. 며칠 작업하면 500MB~2GB까지 부풀어 디스크 I/O가 느려진다.
작업 끝낼 때 청소 (수동)
cd c:\dev\decozip\frontend
# dev 서버 먼저 종료 (Ctrl+C 또는 Stop-Process)
Remove-Item -Recurse -Force .next
청소 스크립트로 만들기
package.json:
"scripts": {
"dev": "cross-env NODE_OPTIONS=--max-old-space-size=2048 next dev",
"clean": "rimraf .next",
"dev:fresh": "npm run clean && npm run dev",
"build": "next build",
"start": "next start",
"lint": "eslint"
}
rimraf 설치:
npm install -D rimraf
이제 깔끔하게 시작하고 싶을 때:
npm run dev:fresh
작업 패턴 권장
- 평소:
npm run dev 한 번 띄워두고 계속 사용
- 메모리/CPU 무거워지면: Ctrl+C →
npm run dev (10초)
- 며칠에 한 번:
npm run dev:fresh (캐시 청소)
- 일주일에 한 번:
Get-Process node로 좀비 점검
적용 순서 추천
| 순서 |
작업 |
권한 |
소요 시간 |
| 1순위 |
Defender 제외 |
관리자 PowerShell |
1분 |
| 2순위 |
VSCode 설정 (.vscode/settings.json) |
일반 |
2분 |
| 3순위 |
메모리 상한 + clean 스크립트 |
일반 |
5분 |
| 습관 |
좀비 점검 |
일반 |
주 1회 |
1번(Defender) + 4번(VSCode 설정) 두 가지만 적용해도 체감 차이가 가장 크다.