본문 바로가기
개발적인

npm install vs npm ci

by klm hyeon woo 2025. 4. 29.

목차

· package.json과 package-lock.json

   · "dependencies"와 "devDependencies"의 차이점은 뭐예요?

· npm install npm ci 무엇이 다를까?


프론트엔드 개발을 진행하다보면 사내 빌드 서버에서 npm이 돌아간 후에 rpm 패키지로 배포가 되는데, 이 rpm 패키지를 기반으로 putty를 통해 프론트엔드 스테이징 서버에 올려 풀리퀘스트를 같이 올리는 과정을 진행해요. 이때 빌드 과정을 유심히 보면 npm ci 라는 명령어가 동작이 되는 것을 확인할 수 있었는데, npm install과 npm ci 둘 다 모두 패키지 설치에 관련된 역할을 하지만, 명확하게 두 역할의 구분이 가지 않아 한번 정리를 해야겠다는 생각이 들었어요.

 

npm install 과 npm ci (clean install) 모두 의존성에 대한 리스트를 설치하는 커맨드이지만, 세부 동작에서 미세한 차이점을 가지고 있어요. npm ci는 npm install에 비해 의존성의 버전을 더 엄격하게 유지를 해요.

package.json과 package-lock.json

npm install과 npm ci의 차이점들을 알아보기 전에, 우리가 평소에 많이 보는 package.json과 package-lock.json이 어떤 점들이 다른지 확인해보려고 해요. package.json의 경우 프로젝트에 필요한 패키지 목록과 버전 범위, 그리고 프로젝트의 기본 정보 (이름, 버전, 스크립트 등)를 정의하는 파일이에요. 개발자가 직접 작성하거나 수정을 하는 파일이고, "dependencies" 또는 "devDependencies" 안에 패키지 이름과 버전 범위를 명시할 수 있어요. 다른 개발자가 해당 프로젝트를 복제했을 때, npm install 만 하면 필요한 패키지를 설치할 수 있어요.

 

"dependencies" 와 "devDependencies"의 차이점은 뭐예요?
· dependencies는 프로덕션(배포) 단계에서 꼭 필요한 패키지들을 적어놓는 곳이에요
   실제 서비스가 돌아갈 때의 운영 서버 및 사용자 환경에서 필요한 코드이고, 기본적으로 dependencies에 있는 것은 무조건 설치돼요.
· devDependencies는 개발할 때만 필요한 패키지들을 적는 곳이에요.
   코드가 개발 중이거나 빌드 과정에만 필요하고, 실제 서비스에는 필요가 없어요. 일반적으로 함께 설치가 되지만, --production 옵션을 준다면 설치가되지 않아요. npm install --production

 

package-lock.json은 설치할 당시에 정확히 설치된 패키지 버전과 의존성 트리를 고정하는 파일이에요. npm install 명령어를 실행하게 되면 자동으로 생성되거나 수정이 되며, 버전 범위 (^1.6.0)가 아니라 정확한 버전(1.6.2) 정보를 저장해요. 패키지마다 어떤 버전을 사용했는지, 서브 의존성(sub-dependency)까지 모두 기록해요. 조금 쉽게 설명을 하면 package.json은 "무엇을 설치할까?"를 명시하는 파일이고, package-lock.json은 "무엇을 정확히 설치했는가"를 기록하는 파일이라고 생각을 하면 돼요. 협업할 때 package.json만 있고, package-lock.json이 없으면, 팀원마다 설치되는 패키지 버전이 달라질 수 있어요. 또, 버그가 발생할 수도 있고, 환경이 달라질 수 있어 디버깅이 힘들어져요, 그래서 두 파일 모두 관리를 잘해야한답니다.

npm install와 npm ci 무엇이 다를까?

npm install은 package.json에 명시된 version range 내에서 다른 버전을 설치할 가능성이 있지만, npm ci는 package-lock.json에 정확하게 표기된 특정 버전을 따라요. 이로 인해 예기치 않게 다른 버전의 의존성을 설치하는 일을 방지해요. 더불어 정확하게 명시된 버전을 설치하므로 버전을 결정하기 위한 연산을 수행할 필요가 없어 설치 속도에서 유리한 측면이 있어요.

 

npm install은 package-lock.json을 변경할 가능성이 있지만, npm ci는 절대 변경을 하지 않아요. 이러한 특징으로 인해 npm ci는 의존성 목록의 버전을 변경없이 일관되게 유지할 수 있어요. 또한, npm ci는 매번 npm_modules를 삭제한 후에 설치해요. 이를 통해 이전에 설치된 의존성과의 충돌로 인한 문제를 방지해요. 오로지 package-lock.json에 따라 매번 동일한 의존성을 설치할 것을 확실하게 보장해요. 이러한 특징들로 인해 npm ci는 CI/CD 환경에서 빌드 과정의 일관성을 보장하기 위한 목적으로 사용되는 경우가 많아요.

댓글