1. 문제 정의

npm i 명령으로 패키지를 설치하려 할 때 다음과 같은 ERESOLVE 오류가 발생하는 경우가 있습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR!
npm ERR! While resolving: [email protected]
npm ERR! Found: @angular/[email protected]
npm ERR! node_modules/@angular/core
npm ERR!   @angular/core@"^9.1.4" from the root project
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer @angular/core@"7.2.16" from @angular/[email protected]
npm ERR! node_modules/@angular/http
npm ERR!   @angular/http@"^7.2.11" from the root project
npm ERR!
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.

핵심 에러 메시지는 ERESOLVE unable to resolve dependency tree이며, npm 버전 7 이상에서 peer dependency 충돌을 엄격하게 검사하면서 발생합니다.

2. 원인 탐구

첫 반응으로 HTTP 프록시 설정을 의심할 수 있지만, 이 오류는 네트워크 문제가 아닙니다. 에러 로그가 직접 말해주듯 의존성 충돌(incorrect and potentially broken dependency)이 원인입니다.

다음 두 요구가 맞물려 있습니다.

항목요구 내용
루트 프로젝트@angular/core@"^9.1.4", @angular/http@"^7.2.11"
@angular/[email protected]peer 의존성으로 @angular/core@"7.2.16" 요구

즉, 루트 프로젝트가 Angular 9(^9.1.4)를 사용하는데, @angular/[email protected]은 동일한 Angular 7(7.2.16)의 핵심을 peer로 요구합니다. 서로 맞지 않는 버전이 공존해야 하므로 npm이 의존성 트리를 해석하지 못하고 오류를 내는 것입니다.

3. 근본 원인 분석

가장 근본적인 원인은 deprecated(더 이상 관리되지 않는) 패키지의 버전 요구가 멈춘 것입니다.

@angular/http는 Angular 팀이 폐기한 패키지로, 이를 공식적으로 대체한 것은 @angular/common/http입니다. 따라서 @angular/http의 최신 버전은 7.2.16이 마지막이며 그 이상은 존재하지 않습니다.

  • 루트 프로젝트가 @angular/http@"^7.2.11"을 요구
  • 하지만 @angular/http의 최신 버전이 7.2.16이므로 ^7.2.11 범위(7.2.11 이상)는 만족 가능

그런데 업데이트 후 No matching version found for @angular/http@^9.1.4 오류가 발생한다면, 요구하는 버전(^9.1.4) 자체가 존재하지 않는 버전을 가리키는 것이라 더 해결이 어렵습니다. 이 경우 프로젝트의 의존성 목록을 확인해 요구 버전을 실제 존재하는 버전으로 바로잡아야 합니다.

요약하면 두 갈래입니다.

  1. peer 충돌: @angular/core 9 vs @angular/http가 요구하는 @angular/core 7 → 명령 옵션으로 우회 가능.
  2. 존재하지 않는 버전 요구: @angular/http@^9.1.4처럼 없는 버전을 참조 → 의존성 재설정 필요.

4. 코드 해결책

해결책 A: --legacy-peer-deps 옵션 (권장)

peer dependency 충돌을 엄격하게 검사하지 않는 예전 npm 방식으로 설치합니다.

1
npm install --legacy-peer-deps

실제로 npm 에러 로그가 스스로 제안하는 옵션 중 하나이며, peer 충돌만으로 막혀 있을 때 가장 안전합니다.

해결책 B: --force 옵션

의도적으로 잘못된(잠재적으로 깨진) 의존성 해석을 받아들이고 강제로 설치합니다.

1
npm install --force

해결책 C: Node.js 버전 다운그레이드 (임시 해결)

위 옵션으로도 해결되지 않으면, 이러한 종류의 오류가 발생할 수 있는 이전 버전의 Node.js로 내려 보는 것이 임시 해결볍이 될 수 있습니다. 단, 이는 근본 원인을 고치지 않으므로 임시 방편으로 사용합니다.

해결책 D: 존재하지 않는 버전 요구 해결 (근본 해결)

만약 No matching version found for @angular/http@^9.1.4 식의 오류가 함께 나온다면, 해당 패키지가 존재하지 않는 버전을 요구하는 상황입니다.

  • @angular/http의 최신 버전은 7.2.16입니다.
  • 프로젝트 package.json에 명시된 버전 범위(^9.1.4 등)가 실제 존재하는 버전을 가리키도록 점검하고 수정합니다.

의존성 버전이 실제 존재하는지 확인합니다.

1
npm view @angular/http versions

deprecated 패키지라면 신규 프로젝트에서는 @angular/common/http처럼 대체 패키지 사용을 검토합니다.

1
2
3
4
5
// deprecated: @angular/http 사용
import { Http } from '@angular/http';

// 권장: @angular/common/http 사용
import { HttpClient } from '@angular/common/http';

5. 향후 예방 조치

  1. 패키지 버전과 존재 여부를 먼저 확인: npm view <패키지> versions, npm view <패키지> peerDependencies 명령으로 실제 존재하는 버전과 peer 요구를 사전에 확인합니다.
  2. deprecated 패키지 제거: @angular/http처럼 폐기된 패키지는 대체 패키지(@angular/common/http)로 마이그레이션해 근본 충돌을 없앱니다.
  3. peer dependency 충돌을 무시하지 않기: --force/--legacy-peer-deps는 발생한 충돌을 우회할 뿐 근본 원인을 해결하지 않습니다. 사용 후에도 패키지 간 버전 정합성을 점검합니다.
  4. 동일한 메이저 버전 유지: Angular 등 프레임워크는 루트 프로젝트와 하위 패키지가 같은 메이저 버전(예: 둘 다 9)을 쓰도록 맞춥니다.
  5. 의존성 명세 재생산: 혼란이 반복되면 package-lock.json을 제거하고 의존성을 다시 잡는 것보다, 먼저 package.json의 버전 범위가 실제 존재하는 버전을 가리키는지 점검합니다.

출처