DevToolBoxFREE
BlogAdvertise

npm install 에러 완전 가이드: 모든 에러와 해결법

12분 읽기by DevToolBox

npm install을 실행하고 빨간 에러 메시지에 막히는 것은 모든 JavaScript 개발자의 통과 의례입니다. macOS의 권한 오류, monorepo의 의존성 충돌, CI의 손상된 캐시 등 원인을 알면 해결은 보통 간단합니다. 이 가이드는 모든 일반적인 npm install 오류를 다루고, 원인을 설명하고, 정확한 수정 명령을 제공합니다.

오류 사전: 빠른 참조 테이블

오류 코드의미빠른 수정
EACCES권한 거부 — npm이 소유하지 않은 디렉터리에 쓰려고 시도.nvm 사용 또는 디렉터리 소유권 수정 (아래 참조).
ENOENT파일 또는 디렉터리를 찾을 수 없음.node_modules와 package-lock.json 삭제 후 재설치.
EPERM작업이 허용되지 않음 — Windows의 파일 잠금 문제가 많음.폴더를 잠그고 있는 편집기/터미널을 닫고 재시도.
ERESOLVE의존성 충돌 — 두 패키지가 호환되지 않는 peer 의존성 버전을 요구.--legacy-peer-deps 또는 --force 사용 (아래 참조).
ERR_SOCKET_TIMEOUT네트워크 타임아웃 — npm이 레지스트리에 연결할 수 없음.네트워크/프록시 설정 확인 또는 미러 레지스트리로 전환.
code 1라이프사이클 스크립트(preinstall, postinstall)가 오류 코드 1로 종료.빌드 도구(Python, node-gyp, C++ 컴파일러) 설치 확인.

EACCES: 권한 오류 수정

macOS와 Linux에서 가장 흔한 오류입니다. npm이 /usr/local/lib/node_modules 같은 시스템 디렉터리에 글로벌 패키지를 설치하려 할 때 발생합니다.

macOS / Linux에서 수정 (권장: nvm 사용)

가장 좋은 영구적 해결책은 Node 버전 관리자를 사용하여 npm이 홈 디렉터리에 설치하도록 하는 것입니다:

# Install nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash

# Restart terminal, then install Node
nvm install --lts
nvm use --lts

# Verify — npm now installs to ~/.nvm/
which npm
# /home/youruser/.nvm/versions/node/v20.x.x/bin/npm

대안: npm 기본 디렉터리를 수동으로 변경:

mkdir -p ~/.npm-global
npm config set prefix '~/.npm-global'

# Add to ~/.bashrc or ~/.zshrc:
export PATH=~/.npm-global/bin:$PATH

# Reload shell
source ~/.bashrc

최후의 수단 (대부분의 사용자에게 비권장):

# NOT recommended — changes system directory ownership
sudo chown -R $(whoami) /usr/local/lib/node_modules
sudo chown -R $(whoami) /usr/local/bin
sudo chown -R $(whoami) /usr/local/share

Windows에서 수정

Windows에서 관리자 권한으로 터미널을 실행하거나 nvm-windows를 사용:

# Install nvm-windows from:
# https://github.com/coreybutler/nvm-windows/releases

# Then in an elevated (Admin) PowerShell:
nvm install lts
nvm use lts

# Or fix npm prefix for current user:
npm config set prefix %APPDATA%\npm

ERESOLVE: 의존성 충돌 수정

npm 7부터 peer 의존성 충돌은 기본적으로 설치를 실패시킵니다. 충돌하는 패키지를 보여주는 트리 다이어그램이 표시됩니다.

일반적인 오류 출력:

npm ERR! code ERESOLVE
npm ERR! ERESOLVE could not resolve
npm ERR!
npm ERR! While resolving: @some-org/some-package@2.1.0
npm ERR! Found: react@18.2.0
npm ERR! node_modules/react
npm ERR!   react@"^18.2.0" from the root project
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer react@"^16.8.0 || ^17.0.0" from some-library@3.5.0
npm ERR! node_modules/some-library
npm ERR!   some-library@"^3.5.0" from the root project

--legacy-peer-deps vs --force

--legacy-peer-deps는 npm에게 peer 의존성 충돌을 완전히 무시하라고 지시합니다 (npm 6과 동일한 동작). --force는 충돌에 관계없이 설치를 강제합니다. 사용 시기:

FlagWhen to Use
--legacy-peer-depspeer dep 불일치가 무해하다고 알 때 (예: React 18 vs 17).
--force캐시된 복사본이 있어도 패키지를 다시 가져오고 충돌을 재정의하고 싶을 때.
# Option 1: Ignore peer deps (safest workaround)
npm install --legacy-peer-deps

# Option 2: Force install (overrides everything)
npm install --force

권장 접근법 — 충돌하는 의존성 고정:

// In package.json — add "overrides" to pin the conflicting dep
{
  "overrides": {
    "some-library": {
      "react": "^18.2.0"
    }
  }
}

// Then run:
// npm install

node_modules 손상: 언제 그리고 어떻게 삭제하고 재설치하는가

node_modules는 때때로 비정상 상태가 됩니다. package.json에 있는 패키지의 "Cannot find module" 오류나 브랜치 전환 후 이상한 빌드 실패가 증상입니다.

node_modules를 삭제해야 할 때

  • 다른 의존성 트리를 가진 브랜치로 전환한 후.
  • package-lock.json의 병합 충돌을 해결한 후.
  • 명확히 설치된 패키지에서 "Module not found"가 나타날 때.
  • Node.js를 새 메이저 버전으로 업그레이드한 후.

클린 재설치 방법

크로스 플랫폼 원라이너 (bash):

rm -rf node_modules package-lock.json
npm install

Windows (PowerShell):

Remove-Item -Recurse -Force node_modules
Remove-Item package-lock.json
npm install

npx 사용:

npx rimraf node_modules
npm install

문제가 지속되면 npm 캐시도 정리:

npm cache clean --force
rm -rf node_modules package-lock.json
npm install

package-lock.json 충돌: 병합 전략

여러 개발자가 의존성을 변경하면 package-lock.json 병합 충돌은 거의 확실히 발생합니다. 수동으로 해결하려 하지 마세요 — 이 파일은 기계 생성입니다.

권장 병합 전략

충돌의 어느 쪽이든 수락 (어느 쪽이든 상관없음):

# Accept "theirs" (the incoming branch's version)
git checkout --theirs package-lock.json
git add package-lock.json

# OR accept "ours" (your branch's version)
git checkout --ours package-lock.json
git add package-lock.json

잠금 파일 재생성:

npm install

결과 커밋:

git add package-lock.json
git commit -m "chore: regenerate package-lock.json after merge"

.gitattributes로 충돌 방지

.gitattributes에 다음을 추가하여 잠금 파일 충돌 자동 해결:

# .gitattributes
package-lock.json merge=ours

Node.js 버전 비호환성

많은 패키지는 특정 Node.js 버전을 필요로 합니다. Node 버전이 너무 오래되거나 새로우면 컴파일 오류나 지원되지 않는 엔진 경고로 npm install이 실패할 수 있습니다.

필요한 버전 확인

package.json의 engines 필드를 확인:

// package.json
{
  "engines": {
    "node": ">=18.0.0",
    "npm": ">=9.0.0"
  }
}

// Check your current version:
// node -v
// npm -v

nvm 또는 fnm으로 버전 전환

nvm (Node Version Manager):

# List available versions
nvm ls-remote

# Install a specific version
nvm install 20

# Switch to a version
nvm use 20

# Set a default
nvm alias default 20

fnm (Fast Node Manager) — 더 빠른 대안:

# Install fnm (Rust-based, faster than nvm)
curl -fsSL https://fnm.vercel.app/install | bash

# Install and use a version
fnm install 20
fnm use 20
fnm default 20

프로젝트 루트에 .nvmrc 파일을 생성하여 팀 전체가 같은 버전을 사용:

# Create .nvmrc file
echo "20" > .nvmrc

# Team members just run:
nvm use
# or
fnm use

CI/CD 문제: Docker 빌드와 GitHub Actions

npm install은 CI 환경에서 다르게 동작합니다. 캐싱, 권한, 네트워크 설정 모두 특별한 주의가 필요합니다.

Docker 빌드

Dockerfile의 일반적인 실수:

# BAD Dockerfile — no layer caching, uses npm install
FROM node:20-alpine
WORKDIR /app
COPY . .
RUN npm install
CMD ["node", "index.js"]

# GOOD Dockerfile — proper layer caching, uses npm ci
FROM node:20-alpine
WORKDIR /app

# Copy package files first (layer caching!)
COPY package.json package-lock.json ./

# Use npm ci for deterministic installs
RUN npm ci --ignore-scripts

# Then copy the rest of the source
COPY . .

# Run any build steps after copy
RUN npm run build

CMD ["node", "index.js"]

핵심: 레이어 캐싱을 위해 package 파일을 먼저 복사, CI에서는 npm install 대신 npm ci 사용 (더 빠르고 결정적), postinstall 스크립트가 불필요하면 --ignore-scripts 사용.

GitHub Actions 캐싱

적절한 캐싱으로 설치 시간을 70% 이상 단축할 수 있습니다:

# .github/workflows/ci.yml
name: CI
on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: 'npm'  # Caches ~/.npm automatically

      - run: npm ci       # Deterministic install
      - run: npm test
      - run: npm run build

결정 플로우차트: npm install 실패 — 이 순서를 따르세요

이 플로우차트로 npm install 실패를 진단하세요:

1. 권한 오류 (EACCES / EPERM)인가?

예 -> nvm 사용 또는 디렉터리 소유권 수정.

2. 의존성 충돌 (ERESOLVE)인가?

예 -> 먼저 --legacy-peer-deps 시도, 그다음 버전 고정 확인.

3. 네트워크 오류 (SOCKET_TIMEOUT / FETCH)인가?

예 -> 프록시, VPN 확인 또는 레지스트리를 미러로 전환.

4. 빌드/컴파일 오류 (node-gyp / code 1)인가?

예 -> 빌드 도구 (python3, make, g++ / Visual Studio Build Tools) 설치.

5. "Cannot find module" 또는 이상한 동작인가?

예 -> node_modules + package-lock.json 삭제 후 npm install.

6. 여전히 실패하는가?

예 -> npm 캐시 정리 (npm cache clean --force), Node 버전 확인, 새 클론 시도.

자주 묻는 질문

Mac에서 "npm ERR! EACCES: permission denied"를 어떻게 수정하나요?

가장 좋은 방법은 nvm(Node Version Manager)을 통해 Node.js를 설치하는 것입니다. 홈 디렉터리에 설치되어 권한 문제를 완전히 피할 수 있습니다. 실행: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash, 그 후 nvm install --lts.

"npm ERR! ERESOLVE could not resolve"는 무슨 뜻인가요?

ERESOLVE는 의존성 트리에서 두 개 이상의 패키지가 같은 peer 의존성의 다른 호환되지 않는 버전을 요구한다는 의미입니다. npm 7부터 이것은 하드 오류입니다. --legacy-peer-deps를 추가하거나 package.json의 overrides 필드에서 호환 버전을 고정하여 수정할 수 있습니다.

npm install 오류를 수정하기 위해 package-lock.json을 삭제해야 하나요?

package-lock.json 삭제는 최후의 수단이어야 하며, 첫 번째 단계가 아닙니다. 잠금 파일은 결정적 설치를 보장합니다. 먼저 node_modules만 삭제하고 npm install을 실행하세요. 실패하면 둘 다 삭제하세요.

왜 Docker에서 npm install이 실패하는데 로컬에서는 작동하나요?

일반적 원인: root로 실행하지만 --unsafe-perm 없음, Docker 이미지에 네이티브 빌드 도구 없음, COPY 순서로 인한 레이어 캐싱 문제, .dockerignore가 node_modules를 제외하지 않음. Docker에서는 npm ci를 사용하세요.

npm install 중 "npm ERR! code 1"을 어떻게 수정하나요?

오류 코드 1은 보통 postinstall 스크립트 실패, 주로 네이티브 모듈 컴파일(node-gyp)을 의미합니다. macOS: xcode-select --install. Ubuntu/Debian: sudo apt install build-essential python3. Windows: Visual Studio Build Tools 설치.

npm install과 npm ci의 차이는 무엇인가요?

npm install은 package.json을 읽고 package-lock.json을 업데이트할 수 있습니다. npm ci(클린 설치)는 node_modules를 삭제하고 package-lock.json만 읽어 정확한 버전을 설치합니다. CI/CD에서는 npm ci를, 로컬 개발에서는 npm install을 사용하세요.

도움이 되었나요?

Stay Updated

Get weekly dev tips and new tool announcements.

No spam. Unsubscribe anytime.

Partner Picks

Sponsor this article

Place your product next to this developer topic with tracked clicks.

Ask about article sponsorship

This site uses cookies for analytics and to display ads. By continuing to browse, you agree. Privacy Policy