# 곳곳에 쌓인 node_modules: 찾고, 정리하고, 다시 설치하는 방법

> Mac의 모든 node_modules 폴더를 크기와 함께 찾고, 필요 없는 것을 지운 뒤 lockfile로 다시 설치하고 패키지 매니저 캐시까지 비우는 방법입니다.

- URL: https://moreroom.app/ko/learn/node-modules-cleanup
- Published: 2026-10-17
- Updated: 2026-10-17
- Publisher: MoreRoom (Yando Pte. Ltd.) — https://moreroom.app

## TL;DR

- package.json과 lockfile만 남겨 두면 node_modules는 삭제해도 안전합니다. npm ci나 pnpm install로 똑같은 버전을 되살릴 수 있습니다.
- -prune을 붙인 find 명령어로 홈 폴더의 모든 node_modules 폴더를 중첩된 폴더까지 들어가지 않고 크기와 함께 나열할 수 있습니다.
- npx npkill로 node_modules 폴더를 둘러보며 대화형으로 지울 수 있지만, 휴지통을 거치지 않고 즉시 삭제합니다.
- pnpm에서는 node_modules의 파일이 공유 저장소의 복제본이나 하드 링크이므로, pnpm store prune을 실행하기 전까지는 지워도 확보되는 공간이 적습니다.
- .next, .turbo, .nuxt, .svelte-kit, .parcel-cache 같은 빌드 폴더도 자동으로 다시 만들어지므로 제거해도 안전합니다.

[node_modules](https://moreroom.app/glossary#node-modules) 폴더에는 JavaScript나 TypeScript 프로젝트 하나에 설치된 의존성이 들어 있으며, 보통 수백 MB 정도입니다. 오래된 프로젝트가 수십 개라면 합쳐서 수십 GB에 이르기 쉽습니다. **`package.json`과 lockfile만 남겨 두면 삭제해도 안전합니다.** 프로젝트로 돌아왔을 때 패키지 매니저가 같은 버전을 다시 설치해 줍니다.

## 모든 node_modules 폴더와 크기 찾기

다음 명령어는 `~/Library`와 휴지통을 건너뛰고 홈 폴더를 검색해, 각 `node_modules` 폴더를 크기와 함께 가장 큰 것이 마지막에 오도록 출력합니다.

```sh
find ~ \( -path "$HOME/Library" -o -path "$HOME/.Trash" \) -prune -o -type d -name node_modules -prune -print0 2>/dev/null | xargs -0 du -sh 2>/dev/null | sort -h
```

동작 방식은 이렇습니다. 첫 번째 `-prune`은 제외할 두 폴더를 건너뛰고, `-type d -name node_modules`는 해당 폴더를 찾으며, 두 번째 `-prune`은 `find`가 그 안으로 들어가지 않게 막습니다. 그래서 중첩된 `node_modules`는 상위 폴더 안에서 한 번만 집계됩니다. `du -sh`가 각 폴더의 크기를 재고 `sort -h`가 목록을 정렬합니다. 읽기만 하는 명령어입니다. 홈 폴더가 크면 몇 분 걸릴 수 있으며, 터미널이 문서, 데스크탑, 다운로드 폴더에 대한 접근 권한을 요청할 수 있습니다.

`~/.nvm`, `~/.vscode`, `~/.cursor` 같은 도구 폴더 안의 결과는 무시하세요. 이 폴더들은 프로젝트가 아니라 설치된 도구와 편집기 확장 프로그램의 것입니다.

프로젝트에서 pnpm을 사용한다면 표시되는 크기가 실제로 되찾을 수 있는 공간보다 큽니다. 이유는 아래에서 설명합니다.

## 필요 없는 폴더 삭제하기

삭제하기 전에 프로젝트 폴더를 열어 lockfile이 있는지 확인하세요. `package-lock.json`(npm), `pnpm-lock.yaml`(pnpm), `yarn.lock`(Yarn), `bun.lock` / `bun.lockb`(Bun) 중 하나입니다. 이 파일과 `package.json`은 남겨 둡니다.

가장 안전하게 지우는 방법은 Finder에서 `node_modules`를 휴지통으로 드래그하는 것입니다. 휴지통을 비우기 전까지는 언제든 마음을 바꿀 수 있습니다. 작은 파일이 많아서 휴지통으로 옮기는 데 잠시 시간이 걸립니다.

터미널에서는 프로젝트 폴더 안에서 다음을 실행합니다.

```sh
cd ~/Projects/old-app
rm -rf node_modules
```

`rm -rf`는 휴지통을 거치지 않고 영구적으로 삭제합니다. 먼저 `pwd`로 현재 폴더를 확인하고, 와일드카드나 빈 변수와 함께 실행하는 일은 절대 없도록 하세요.

### npkill: 대화형 대안

[npkill](https://github.com/voidcosmos/npkill)은 `node_modules` 폴더를 크기와 함께 나열하고, 키 하나로 하나씩 삭제할 수 있게 해 줍니다.

```sh
npx npkill -d ~/Projects
```

`-d`는 검색을 시작할 위치를 정하며, 지정하지 않으면 현재 폴더에서 시작합니다. 화살표 키로 이동하고 Space나 Del을 눌러 선택한 폴더를 삭제합니다. npkill은 휴지통을 거치지 않고 즉시 삭제합니다. 앱 실행에 필요한 폴더에는 ⚠️ 표시가 붙으므로 그대로 두세요. 먼저 시험해 보고 싶다면 `--dry-run`으로 삭제를 흉내 낼 수 있습니다.

## 프로젝트로 돌아오면 다시 설치하기

lockfile에 적힌 그대로 설치하는 명령어를 사용하세요.

| 패키지 매니저 | lockfile | 다시 설치 |
|---|---|---|
| npm | `package-lock.json` | `npm ci` |
| pnpm | `pnpm-lock.yaml` | `pnpm install --frozen-lockfile` |
| Yarn(Berry) | `yarn.lock` | `yarn install --immutable` |
| Yarn Classic | `yarn.lock` | `yarn install --frozen-lockfile` |
| Bun | `bun.lock` | `bun install --frozen-lockfile` |

[`npm ci`](https://docs.npmjs.com/cli/v11/commands/npm-ci)는 lockfile이 반드시 있어야 하며, 기존 `node_modules`를 먼저 지우고, `package.json`이나 lockfile을 절대 바꾸지 않습니다. 그냥 `npm install`을 써도 되지만 lockfile이 업데이트될 수 있습니다.

## 저절로 다시 만들어지는 다른 폴더

프레임워크와 빌드 도구는 `node_modules` 옆에 캐시와 출력물을 둡니다. 실행하지 않는 프로젝트라면 지워도 안전하며, 다음 빌드나 개발 서버가 다시 만듭니다.

| 폴더 | 생성 주체 |
|---|---|
| `.next` | Next.js |
| `.nuxt` | Nuxt |
| `.svelte-kit` | SvelteKit |
| `.turbo` | Turborepo |
| `.parcel-cache` | Parcel |
| `.angular` | Angular CLI |

`dist`와 `build`도 대개 빌드 출력물이지만 이름이 흔합니다. 일부 프로젝트는 이 폴더에 파일을 커밋하거나 다른 용도로 쓰므로, 지우기 전에 안을 확인하세요.

프로젝트 폴더 안의 프레임워크 캐시를 나열하려면 다음을 실행합니다.

```sh
find ~/Projects -type d \( -name .next -o -name .nuxt -o -name .svelte-kit -o -name .turbo -o -name .parcel-cache \) -prune -print0 | xargs -0 du -sh | sort -h
```

## 전역 패키지 캐시 비우기

패키지 매니저마다 모든 프로젝트가 공유하는 다운로드 캐시도 있습니다. 비우면 되돌릴 수 없지만 해가 되지는 않습니다. 필요할 때 패키지를 다시 내려받습니다.

```sh
npm cache clean --force
pnpm store prune
yarn cache clean
bun pm cache rm
```

- **npm**은 캐시를 `~/.npm/_cacache`에 둡니다. [npm 캐시 문서](https://docs.npmjs.com/cli/v11/commands/npm-cache)는 `clean`에 `--force`가 필요한 이유를 설명하고, `npm cache verify`가 전체를 비우지 않고 가비지 컬렉션만 한다는 점도 알려 줍니다. `npx`가 가져온 패키지는 `~/.npm/_npx`에 있습니다.
- **pnpm**은 macOS에서 저장소를 `~/Library/pnpm/store`에 둡니다(`pnpm store path`로 실제 위치를 확인할 수 있습니다). [`pnpm store prune`](https://pnpm.io/cli/store)은 어떤 프로젝트도 참조하지 않는 패키지만 제거하며, pnpm 문서는 이 명령어를 자주가 아니라 가끔 실행하라고 권합니다.
- **Yarn Classic**은 `~/Library/Caches/Yarn`에 캐시합니다. Yarn Berry에서는 `yarn cache clean --mirror`가 `~/.yarn/berry/cache`의 전역 캐시를 비웁니다.
- **Bun**은 `~/.bun/install/cache`에 캐시하며, `bun pm cache rm`으로 비울 수 있습니다.

nvm으로 설치한 오래된 Node.js 버전도 `~/.nvm/versions/node`에 쌓입니다. 더 이상 필요 없는 버전은 `nvm uninstall <version>`으로 제거하세요.

## pnpm에서 du가 보여 주는 것보다 적게 확보되는 이유

npm과 Yarn Classic은 모든 패키지를 각 프로젝트의 `node_modules`에 복사합니다. pnpm은 각 패키지를 [콘텐츠 주소 기반 저장소](https://pnpm.io/motivation)에 한 번만 저장하고, 그 파일을 패키지를 사용하는 모든 프로젝트에 연결합니다. macOS에서 pnpm의 기본 [`packageImportMethod`](https://pnpm.io/settings/node-modules)는 먼저 APFS 복제본을 시도하고, 그다음 [하드 링크](https://moreroom.app/glossary#hard-link)를 사용합니다.

![npm은 패키지를 프로젝트마다 복사하고, pnpm은 복제본이나 하드 링크로 저장소 하나를 공유합니다](https://moreroom.app/learn/img/node-modules-cleanup-pnpm-store.svg)

어느 쪽이든 실제 데이터는 공유됩니다. 그런데 `du`는 프로젝트마다 전체 크기를 집계하므로, pnpm 프로젝트의 `node_modules`를 지우면 보통 보고된 크기보다 훨씬 적은 공간만 확보됩니다. 남은 프로젝트가 아무도 쓰지 않는 패키지를 `pnpm store prune`이 제거할 때 공간이 돌아옵니다. 이 방식이 동작하려면 저장소가 프로젝트와 같은 디스크에 있어야 하며, 외장 드라이브의 프로젝트는 그 드라이브에 자체 저장소를 따로 둡니다.

## MoreRoom이 도와드리는 방법

MoreRoom 무료 버전은 lockfile이 있고 30일 동안 손대지 않은 프로젝트의 `node_modules` 폴더와 `.next`, `.turbo` 같은 프레임워크 캐시를 찾아 ‘안전하게 제거 가능’ 라벨을 붙입니다. `~/Library`와 `~/.nvm`, `~/.vscode` 같은 도구 폴더는 건너뜁니다. 항목은 한 번에 하나씩 휴지통으로 이동하며 실행 취소할 수 있습니다. npm 캐시와 pnpm 저장소에는 `npm cache clean --force`와 `pnpm store prune`을 실행합니다. 이 명령어는 되돌릴 수 없으며, 앱에도 그렇게 표시됩니다.

MoreRoom Pro에는 프로젝트 휴면 기능이 더해집니다. 비활성 프로젝트에서 `node_modules`나 빌드 출력물처럼 다시 만들 수 있는 폴더를 정리하고, 프로젝트로 돌아오면 클릭 한 번으로 다시 깨울 수 있습니다. Pro에는 컬렉터와 목표 모드도 포함됩니다.

## FAQ

### node_modules를 삭제해도 안전한가요?

네. 설치된 의존성만 들어 있으며, 패키지 매니저가 package.json과 lockfile로 다시 설치할 수 있습니다. 지금 실행하고 있지 않은 프로젝트에서만 지우고, lockfile은 남겨 두세요.

### package-lock.json도 지워야 하나요?

아니요. lockfile에는 제대로 동작했던 정확한 버전이 기록되어 있습니다. 나중에 npm ci, pnpm install, yarn install로 같은 node_modules를 다시 만들 수 있도록 남겨 두세요.

### pnpm 프로젝트에서 node_modules를 지워도 공간이 거의 늘지 않는 이유는 무엇인가요?

pnpm은 각 패키지를 공유 저장소에 한 부만 보관하고, 그 파일을 모든 프로젝트에 복제하거나 하드 링크로 연결합니다. 프로젝트의 node_modules를 지우면 링크만 사라지며, pnpm store prune을 실행해야 어떤 프로젝트도 쓰지 않는 패키지가 삭제됩니다.

### npm cache clean --force는 안전한가요?

네. ~/.npm/_cacache에 있는 npm의 다운로드 캐시를 비우며, 필요하면 npm이 패키지를 다시 내려받습니다. npm 문서에도 캐시를 비우는 것은 디스크 공간을 되찾을 때만 의미가 있다고 나와 있습니다.

### npkill은 폴더를 휴지통으로 옮기나요?

아니요. npkill은 선택한 폴더를 즉시 삭제합니다. 미리 연습해 보려면 --dry-run 옵션을 사용하고, 휴지통이라는 안전망이 필요하다면 Finder를 사용하세요.
