devops2025-05-05·8·91/348

npm outdated 패키지 업데이트 전략

npm outdated 명령어를 사용하여 의존성 업데이트를 효과적으로 관리하는 전략을 다룹니다.

Introduction

프로젝트의 의존성을 최신 상태로 유지하는 것은 보안과 성능에 중요합니다. npm outdated 명령어를 사용하면 outdated된 패키지를 쉽게 확인할 수 있습니다.

Environment

npm --version
# 10.2.4

node --version
# v20.11.0

# outdated 패키지 확인
npm outdated

Problem

프로젝트에 outdated된 패키지가 너무 많아 업데이트에 어려움이 있었습니다:

$ npm outdated
Package     Current  Wanted  Latest  Location
express     4.17.1   4.18.2  4.18.2  my-project
lodash      4.17.19  4.17.21 4.17.21 my-project
axios       0.21.1   1.6.0   1.6.0   my-project
typescript  4.3.5    5.3.3   5.3.3   my-project

# npm audit 결과
found 47 vulnerabilities (12 moderate, 23 high, 12 critical)

Analysis

버전 비교

항목의미예시
Current현재 설치된 버전4.17.1
Wantedpackage.json 허용 범위 내 최신4.18.2
Latestnpm 레지스트리 최신 버전4.18.2

업데이트 유형

{
    "dependencies": {
        "express": "^4.17.1",    // Minor/Patch 업데이트 허용
        "react": "~18.2.0",     // Patch 업데이트만 허용
        "moment": "2.29.4"      // 정확한 버전 고정
    }
}

Solution

1. 안전한 업데이트 순서

# 1단계: outdated 패키지 확인
$ npm outdated

# 2단계: patch 업데이트 (안전)
$ npm update --save

# 3단계: minor 업데이트
$ npm install package@minor

# 4단계: major 업데이트 (주의)
$ npm install package@latest

2. 자동 업데이트 스크립트

#!/bin/bash
# scripts/update-deps.sh

echo "=== Checking outdated packages ==="
npm outdated

echo ""
echo "=== Updating patch versions ==="
npm update --save

echo ""
echo "=== Running tests ==="
npm test

if [ $? -eq 0 ]; then
    echo ""
    echo "=== Tests passed! Committing changes ==="
    git add package.json package-lock.json
    git commit -m "chore: update patch dependencies"
else
    echo ""
    echo "=== Tests failed! Rolling back ==="
    git checkout package.json package-lock.json
    npm install
fi

3. npm-check-updates 사용

# 설치
$ npm install -g npm-check-updates

# outdated된 패키지 확인
$ ncu

# package.json 업데이트
$ ncu -u

# 특정 패키지만 업데이트
$ ncu -u express

# 설치 후 테스트
$ npm install
$ npm test

4. GitHub Actions 자동화

# .github/workflows/dependency-update.yml
name: Dependency Update

on:
  schedule:
    - cron: '0 0 * * 1'  # 매주 월요일

jobs:
  update:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
          
      - run: npm ci
      
      - name: Check outdated
        run: npm outdated
        
      - name: Update dependencies
        run: |
          npm update --save
          npm audit fix
          
      - name: Run tests
        run: npm test
        
      - name: Create PR
        if: success()
        uses: peter-evans/create-pull-request@v5
        with:
          title: 'chore: update dependencies'
          branch: dependency-updates

5. 버전 고정 전략

{
    "dependencies": {
        "express": "^4.18.2",
        "react": "^18.2.0"
    },
    "devDependencies": {
        "typescript": "~5.3.3",
        "eslint": "^8.56.0"
    },
    "overrides": {
        "minimist": "^1.2.8"
    }
}

6. lockfile 유지 관리

# lockfile 검증
$ npm ci

# lockfile 재생성
$ rm package-lock.json
$ npm install

# lockfile 변경사항 확인
$ git diff package-lock.json

Lessons Learned

  1. 정기적 업데이트: 주 1회 outdated 패키지를 확인하고 업데이트하세요
  2. 테스트 우선: 업데이트 후 항상 테스트를 실행하세요
  3. 단계적 진행: Major 업데이트는 주의 깊게, 단계적으로 진행하세요
  4. lockfile 관리: package-lock.json을 항상 커밋하세요
  5. 보안 검사: npm audit로 보안 취약점을 정기적으로 확인하세요

This blog does not accept any external sponsorships, affiliate marketing, or ad revenue.