npm outdated와 npm update 차이
의존성을 관리하다 보면 npm outdated와 npm update를 만나게 된다.
둘 다 패키지 업데이트와 관련된 명령어처럼 보이지만 역할은 다르다.npm outdated는 오래된 패키지를 확인하는 명령어이고, npm update는 실제로 패키지를 업데이트하는 명령어다.
초보자 입장에서는 바로 npm update를 실행하고 싶을 수 있다.
하지만 먼저 npm outdated로 현재 상태를 보고, 어떤 범위 안에서 업데이트될지 이해하는 편이 안전하다.
npm outdated의 역할
npm outdated는 설치된 패키지 중 오래된 패키지가 있는지 확인한다.
npm 공식 문서 기준으로 이 명령어는 registry를 확인해서 현재 설치된 패키지가 최신 상태인지 비교한다.
npm outdated실행하면 보통 아래와 비슷한 표가 나온다.
Package Current Wanted Latest Location
eslint 9.35.0 9.39.4 9.39.4 node_modules/eslint
next 16.1.0 16.2.4 16.2.4 node_modules/next이 명령어는 확인용이다.package.json이나 package-lock.json을 바꾸지 않는다.
먼저 어떤 패키지가 오래됐는지 보는 데 사용한다.
Current, Wanted, Latest의 의미
npm outdated에서 가장 중요한 열은 Current, Wanted, Latest다.
Current는 현재 설치된 버전이다.node_modules나 lock 파일 기준으로 지금 프로젝트가 쓰고 있는 버전이라고 보면 된다.
Wanted는 package.json의 semver 범위를 만족하는 가장 높은 버전이다.
예를 들어 ^1.2.3 범위라면 2.0.0 전까지 가능한 최신 버전이 Wanted가 될 수 있다.
Latest는 npm registry에서 latest dist-tag가 가리키는 버전이다.
보통 최신 안정 버전처럼 쓰이지만, 패키지 관리자가 dist-tag를 어떻게 운영하느냐에 따라 항상 가장 높은 버전이라는 뜻은 아닐 수 있다.
Current Wanted Latest
1.2.3 1.4.0 2.0.0이런 출력이라면 현재는 1.2.3을 쓰고 있고, 현재 package.json 범위 안에서는 1.4.0까지 올릴 수 있다는 뜻이다.2.0.0은 더 최신이지만 현재 semver 범위 밖일 수 있다.
색상 표시의 의미
npm 문서 기준으로 npm outdated 출력에서 빨간색은 현재 semver 요구사항 안에 더 새 버전이 있다는 뜻이다.
즉 지금 바로 업데이트해도 package.json의 버전 범위를 벗어나지 않는다.
노란색은 더 새 버전이 있기는 하지만 현재 semver 범위 밖이라는 뜻이다.
대개 새 major 버전이거나 0.x에서 더 조심해야 하는 minor 변경일 수 있다.
색상은 터미널 환경에 따라 다르게 보일 수 있다.
색상보다 중요한 것은 Wanted와 Latest의 차이를 보는 것이다.Wanted까지만 올리는 업데이트와 Latest까지 올리는 업데이트는 의미가 다르다.
npm update의 역할
npm update는 실제로 패키지를 업데이트한다.
npm 공식 문서 기준으로 이 명령어는 패키지와 그 의존성의 semver 제약을 지키면서 가능한 최신 버전으로 업데이트한다.
npm update패키지 이름을 지정할 수도 있다.
npm update eslint패키지 이름을 지정하지 않으면 현재 위치의 패키지들이 업데이트 대상이 된다.
전역 패키지를 업데이트하려면 -g를 붙인다.
npm update -gsemver 범위 안에서 업데이트
npm update는 보통 Latest까지 무조건 올리는 명령어가 아니다.package.json에 적힌 semver 범위를 지키면서 올린다.
예를 들어 의존성이 이렇게 적혀 있다고 하자.
{
"dependencies": {
"some-package": "^1.1.1"
}
}registry에 1.2.2가 있고 이 버전이 ^1.1.1 범위를 만족한다면 npm update는 1.2.2로 올릴 수 있다.
반대로 ~1.1.1이라면 범위가 더 좁다.
{
"dependencies": {
"some-package": "~1.1.1"
}
}이 경우 1.2.2가 있어도 ~1.1.1 범위 밖이라면 설치되지 않는다.
대신 1.1.x 안에서 가능한 가장 높은 버전이 선택된다.^와 ~의 차이는 package.json에서 ^와 ~ 차이에 따로 정리해두었다.
package.json과 package-lock.json 변화
npm update를 실행하면 실제 설치 버전이 바뀔 수 있고, package-lock.json도 갱신될 수 있다.
lock 파일은 실제 설치된 의존성 트리를 기록하기 때문이다.
다만 npm v11 문서 기준으로 npm update는 기본적으로 프로젝트의 직접 의존성 semver 값을 package.json에서 바꾸지 않는다.package.json의 버전 범위까지 같이 바꾸고 싶다면 npm update --save를 사용할 수 있다.
npm update --save초보자라면 먼저 기본 npm update로 lock 파일이 어떻게 바뀌는지 확인하는 편이 좋다.
그리고 package.json의 범위 자체를 바꿔야 하는 상황인지 따로 판단한다.
major 버전으로 올리는 방법
npm update가 현재 semver 범위 밖의 major 버전까지 올려주지는 않는 경우가 많다.
예를 들어 ^1.2.3은 보통 2.0.0 전까지만 허용한다.2.0.0으로 올리고 싶다면 의존성 범위를 직접 바꾸는 설치 명령을 쓰는 편이 명확하다.
npm install some-package@latest또는 특정 버전을 지정한다.
npm install some-package@2.0.0major 업데이트는 깨지는 변경을 포함할 수 있다.
릴리스 노트를 확인하고, 테스트를 돌리고, 필요한 코드 수정을 함께 해야 한다.
안전한 업데이트 순서
처음부터 npm update를 실행하기보다 확인 단계를 두는 편이 좋다.
npm outdated먼저 Current, Wanted, Latest를 본다.Wanted가 올라가 있는 패키지는 현재 범위 안에서 업데이트할 수 있다.Latest만 더 높은 패키지는 major 업데이트나 범위 밖 업데이트일 수 있으니 릴리스 노트를 본다.
그 다음 특정 패키지만 업데이트한다.
npm update eslint변경된 package-lock.json을 확인하고 테스트를 실행한다.
npm test
npm run buildCI에서 재현 가능한 설치가 필요하다면 npm ci를 사용한다.
이 흐름은 npm ci란?에 정리해두었다.
npm audit과의 차이
npm outdated와 npm update는 버전 최신화에 가깝다.
보안 취약점을 확인하는 명령어는 npm audit이다.
npm auditnpm audit은 프로젝트 의존성 정보를 registry에 보내 알려진 취약점 보고서를 받는다.npm audit fix는 가능한 경우 취약점을 고치기 위한 업데이트를 적용한다.
다만 npm audit fix --force는 semver major 업데이트처럼 큰 변경을 적용할 수 있으므로 조심해야 한다.
업데이트 목적이 “최신화”인지 “보안 취약점 대응”인지 구분해서 명령어를 선택하는 편이 좋다.
정리
npm outdated는 오래된 패키지를 확인하는 명령어다.
프로젝트 파일을 바꾸지 않고 Current, Wanted, Latest를 보여준다.
npm update는 실제로 패키지를 업데이트하는 명령어다.
기본적으로 package.json의 semver 범위를 지키면서 업데이트하고, package-lock.json이 바뀔 수 있다.
major 버전까지 올리고 싶다면 npm install 패키지@latest처럼 명시적으로 범위를 바꾸는 편이 더 분명하다.
업데이트 후에는 lock 파일 변경을 확인하고 테스트와 빌드를 돌리는 습관이 좋다.
참고 자료












