현록

npm outdated와 npm update 차이

의존성을 관리하다 보면 npm outdatednpm 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 파일 기준으로 지금 프로젝트가 쓰고 있는 버전이라고 보면 된다.

Wantedpackage.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 변경일 수 있다.

색상은 터미널 환경에 따라 다르게 보일 수 있다.
색상보다 중요한 것은 WantedLatest의 차이를 보는 것이다.
Wanted까지만 올리는 업데이트와 Latest까지 올리는 업데이트는 의미가 다르다.

npm update의 역할

npm update는 실제로 패키지를 업데이트한다.
npm 공식 문서 기준으로 이 명령어는 패키지와 그 의존성의 semver 제약을 지키면서 가능한 최신 버전으로 업데이트한다.

npm update

패키지 이름을 지정할 수도 있다.

npm update eslint

패키지 이름을 지정하지 않으면 현재 위치의 패키지들이 업데이트 대상이 된다.
전역 패키지를 업데이트하려면 -g를 붙인다.

npm update -g

semver 범위 안에서 업데이트

npm update는 보통 Latest까지 무조건 올리는 명령어가 아니다.
package.json에 적힌 semver 범위를 지키면서 올린다.

예를 들어 의존성이 이렇게 적혀 있다고 하자.

{
  "dependencies": {
    "some-package": "^1.1.1"
  }
}

registry에 1.2.2가 있고 이 버전이 ^1.1.1 범위를 만족한다면 npm update1.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.0

major 업데이트는 깨지는 변경을 포함할 수 있다.
릴리스 노트를 확인하고, 테스트를 돌리고, 필요한 코드 수정을 함께 해야 한다.

안전한 업데이트 순서

처음부터 npm update를 실행하기보다 확인 단계를 두는 편이 좋다.

npm outdated

먼저 Current, Wanted, Latest를 본다.
Wanted가 올라가 있는 패키지는 현재 범위 안에서 업데이트할 수 있다.
Latest만 더 높은 패키지는 major 업데이트나 범위 밖 업데이트일 수 있으니 릴리스 노트를 본다.

그 다음 특정 패키지만 업데이트한다.

npm update eslint

변경된 package-lock.json을 확인하고 테스트를 실행한다.

npm test
npm run build

CI에서 재현 가능한 설치가 필요하다면 npm ci를 사용한다.
이 흐름은 npm ci란?에 정리해두었다.

npm audit과의 차이

npm outdatednpm update는 버전 최신화에 가깝다.
보안 취약점을 확인하는 명령어는 npm audit이다.

npm audit

npm 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 파일 변경을 확인하고 테스트와 빌드를 돌리는 습관이 좋다.

참고 자료

관련 포스트
npm install -g와 npx 차이 thumbnail
npm install -g와 npx 차이
npm install -g와 npx의 차이를 초보자 기준으로 정리합니다. 전역 설치, 로컬 설치, 일회성 실행, 프로젝트 scripts에 넣는 기준까지 함께 봅니다.
package.json에서 ^와 ~ 차이 thumbnail
package.json에서 ^와 ~ 차이
package.json 의존성 버전 앞에 붙는 ^와 ~의 차이를 초보자 기준으로 정리합니다. semantic versioning, 버전 범위, 0.x 예외, package-lock.json과의 관계까지 함께 봅니다.
npx와 npm exec 차이 thumbnail
npx와 npm exec 차이
npx와 npm exec가 어떤 명령어인지 초보자 기준으로 정리합니다. 로컬 패키지 실행, 원격 패키지 임시 실행, --package 옵션, -- 인자 전달 차이까지 함께 봅니다.
package.json scripts와 npm run 정리 thumbnail
package.json scripts와 npm run 정리
package.json의 scripts와 npm run 명령어를 초보자 기준으로 정리합니다. npm run dev, npm start, npm test, node_modules/.bin, -- 인자 전달 방식까지 함께 봅니다.
dependencies와 devDependencies 차이 thumbnail
dependencies와 devDependencies 차이
package.json의 dependencies와 devDependencies 차이를 초보자 기준으로 정리합니다. npm install과 npm install -D, 배포 환경 설치, package-lock.json과의 관계까지 함께 봅니다.
npm ci란? thumbnail
npm ci란?
npm ci는 CI, 테스트, 배포처럼 같은 의존성 트리를 반복해서 설치해야 하는 환경에 어울리는 clean install 명령어입니다. package-lock.json 조건, npm install과의 차이, .npmrc 플래그 주의점을 정리합니다.
.npmrc 파일이란? thumbnail
.npmrc 파일이란?
storybook을 사용해보려고 하다 마주한 이슈의 해결법을 알아보다가 등장한 .npmrc라는 파일에 대해 공부해보았다. .npmrc 파일이란? .npmrc 파일은 npm에 대한 config 파일이다. (npm에 대한 rc 파일) 프로젝트별 registry, install 옵션, 인증 토큰처럼 npm CLI가 읽는 설정을 관리할 때 사용한다.
스토리북이란? thumbnail
스토리북이란?
Storybook은 UI 컴포넌트를 독립적으로 개발하고, 문서화하고, 테스트하기 위한 프론트엔드 워크샵입니다. Storybook 10.4 기준 설치 흐름과 stories, 문서화, 테스트 활용 방식을 정리합니다.
TTV와 TTI란? thumbnail
TTV와 TTI란?
TTV는 Time to View이며, 사용자가 화면을 보는 시점을 의미한다. TTI는 Time to Interact이며, 사용자가 웹에서 특정 동작을 수행할 수 있는 시점을 의미한다.
Maria DB 외부 접속 설정하기 thumbnail
Maria DB 외부 접속 설정하기
안녕하세요. 오늘은 Maria DB 초기 세팅 시, 외부에서 접속이 안될 때 매뉴얼을 작성해보겠습니다. dotenv 패키지를 통해서 환경변수로 관리한다면, 별도의 추가 작업을 할 일이 없으실 겁니다.
package-lock.json 파일의 역할 thumbnail
package-lock.json 파일의 역할
안녕하세요. 오늘은 node 환경의 개발자라면 한번쯤 궁금했을만한 package-lock.json의 역할에 대해 알아보겠습니다. 우리는 node 환경에서 개발을 할 때 다양한 패키지들을 설치하여 활용하곤 합니다. 우리가 설치하는 패키지 또한 다른 npm 패키지를 활용하여 만든 패키지들이고 이들 또한 설치를 하게 됩니다. 이렇게 직간접적으로 설치된 패키지들은 대부분 호환성을 "^1.1.5"와 같이 표현하여, 범위로 지정해두고 있습니다.
Linux 환경 배포 자동화 체험해보기 thumbnail
Linux 환경 배포 자동화 체험해보기
안녕하세요. 요즘 포트폴리오를 만들면서 서버 상에 자주 반영할 일이 생겼는데, 매번 명령어들을 타이핑하는 것이 비효율적이라 생각이 들어 배포 자동화를 생각해보게 되었습니다. 현재 레벨에서는 단순히 명령어들만 단축시켜도 효율적이라 생각이 들어 간단한 쉘 스크립트만 작성하였습니다. 정말 간단하니 여러분도 도전해보시길 바랍니다.
협업 필수품. Prettier thumbnail
협업 필수품. Prettier
안녕하세요. 오늘은 Prettier이라는 도구에 대해 알려드리고자 합니다. 개발자는 각자의 코딩스타일이 존재합니다. 그러다보니 같은 프로젝트에서도 작성하는 소스마다 스타일이 제각기 다르기 일쑤입니다. 그럴 때 도입하면 좋은 것이 Prettier입니다. 프로젝트 root 폴더에 .prettierrc 라는 파일을 생성한 뒤, 위 예시와 같이 원하는 옵션을 JSON 형식으로 작성해주면 됩니다.