패키지 매니저(Package Manager)

 

01. 패키지 매니저란?

패키지 매니저는 프로젝트에서 필요한 외부 라이브러리, 모듈, 플러그인 등을 손쉽게 설치하고 관리하는 도구이다.

특히, 의존성 관리를 중심으로 프로젝트의 설정과 배포를 보다 간편하게 만들어준다.

자바스크립트 뿐만 아니라 다양한 언어에서 사용되며, 각 언어별로 대표적인 패키지 매니저와 저장소(레퍼지토리)가 존재한다.

 

 

#1. 패키지란?

패키지는 배포 가능한 코드의 묶음으로, 라이브러리(코드 모음), 실행 파일, 환경 설정 파일 및 의존성 정보 등을 포함한다. 자바스크립트 프로젝트에서는 주로 오픈 소스 라이브러리 형태로 제공되며, 패키지 매니저를 통해 간단하게 설치 및 관리할 수 있다.

 

 

#2. 패키지 매니저의 주요 기능

1️⃣ 패키지 설치

프로젝트에 필요한 패키지를 설치할 수 있다.

패키지는 일반적으로 오픈 소스 라이브러리이며, 패키지 매니저를 통해 패키지의 이름 또는 버전을 지정하여 설치할 수 있다.

 

2️⃣ 의존성 관리

패키지들은 다른 패키지에 의존할 수 있으며, 이를 의존성이라 한다.

패키지 매니저는 의존성들을 자동으로 설치하고, 이를 관리하여 Dependency Hell 문제를 해결한다.

이때 Dependency Hell은 의존성 설치 중 의존성의 의존성이 필요한 상황이 반복되면서 수동 관리가 어려워지는 문제이다.

 

3️⃣ 버전 관리

패키지 매니저는 다양한 버전의 패키지를 관리하며, 특정 버전의 패키지를 설치하거나 업데이트할 수 있다.

프로젝트에서 정확한 버전의 패키지를 사용하도록 보장하여 예상치못한 버그나 충돌을 줄여준다.

npm install react@18-2.0

 

4️⃣ 스크립트 실행

빌드, 테스트, 배포 등의 작업을 자동화하기 위해 스크립트를 정의하고 실행할 수 있다.

package.json 파일의 “scripts” 항목에서 스크립트를 정의하고, npm run, yarn run 으로 실행할 수 있다.

 

5️⃣ 보안 관리

패키지 매니저는 설치된 신뢰성과 무결성을 검사하여 안전한 설치를 보장한다.

npm audit, yarn audit 등을 사용해 보안 문제를 점검하고 해결할 수 있다.

 

6️⃣ 패키지 압축 해제 및 설치

패키지 매니저는 압축된 패키지 파일을 자동으로 해제하고, 프로젝트 디렉토리에 설치한다.

이 과정에서 의존성 트리를 분석하고 필요한 모든 패키지를 설치한다.

 

 

 

02. 자바스크립트 패키지 매니저 비교

#1. npm (Node Package Manager)

npm은 자바스크립트 패키지 매니저의 표준이라 할 수 있다.

Node.js 설치 시 기본으로 제공되며, 대부분의 자바스크립트 프로젝트에서 사용된다.

  • 설치 방식: 직렬 설치. 라이브러리 설치 시 종속성에 따라 순차적으로 설치
  • 의존성 관리: package.json과 package-lock.json 파일로 관리
    • package.json : 설치할 라이브러리의 이름과 버전이 명시
    • package-lock.json : 의존성 트리를 고정해 모든 개발자가 동일한 의존성을 설치할 수 있도록 제공
  • 글로벌 설치: -g 옵션을 통해 글로벌하게 패키지 설치 가능

안정성이 높고, 다양한 스크립트 명령어를 통해 빌드, 테스트, 배포 작업을 쉽게 관리할 수 있다.

하지만 설치가 직렬로 이루어지기 때문에 속도가 느리며, 글로벌 설치 시 버전 충돌 문제가 발생할 수 있다.

npm install react
npm install -g create-react-app
npm run build

 

 

#2. npx (Node Package eXecute)

npx는 npm 5.2 버전부터 추가된 도구로, 설치 없이 패키지를 실행할 때 유용하다. 즉, npm의 설치 + 실행 방식에서 npx는 설치 없이 바로 실행을 가능하게 해주는 도구이다. 특히 create-react-app과 같은 보일러플레이트 생성 도구를 사용할 때 많이 사용된다.

패키지를 설치하지 않아도 되기 때문에, 글로벌 혹은 로컬 영역을 더럽히지 않는다.

 

여기서 로컬 영역을 더럽히지 않는다는 의미는 다음과 같다.

npm을 사용하면 패키지를 설치할 때 주로 프로젝트의 로컬 node_modules 폴더에 설치하게 된다.

여기서 로컬 영역을 더럽힌다는 의미는 필요하지 않은 패키지를 여러 개 설치할 경우 node_modules 폴더가 무거워지고 관리하기 어려워질 수 있다는 의미이다. npx는 패키지를 굳이 설치하지 않고도 실행할 수 있으므로, 불필요한 패키지 설치 없이 깔끔하게 사용할 수 있다는 점에서 글로벌 혹은 로컬 영역을 더럽히지 않는다는 것이다.

 

npx는 패키지를 실행할 때 3단계 우선순위로 패키지를 찾는다.

  1. 로컬 node_modules/.bin 폴더에서 먼저 패키지 내 검색 : 예를 들어, 프로젝트 폴더에 있는 node_modules에 eslint가 설치되어 있으면, npx eslint를 실행할 때 이 폴더의 eslint를 사용한다.
  2. 글로벌 node_modules/.bin 폴더에서 검색 : 만약 로컬 node_modules에 패키지가 없으면, 시스템에 설치된 글로벌 패키지를 찾는다.
  3. 모든 곳에 없으면 npx는 설치할 것인지 물어보고 ./npm 내 /.npx 캐싱 디렉토리 내 설치 후 실행
npx create-react-app my-app

 

npx는 매번 최신 버전을 가져와 실행하므로, 버전 관리에 신경 쓸 필요가 없다.

하지만 매 실행 시마다 패키지를 다운로드하기 때문에 네트워크 성능에 따라 느려질 수 있다.

 

 

#3. yarn

yarn은 빠른 속도 및 패키지 종속성 문제를 해결하기 위해 등장하였다.

npm은 직렬로 설치하기 때문에 순차적으로 진행되었지만, yarn은 병렬로 패키지를 설치하여 여러 패키지를 동시에 설치하여 속도를 개선하였다.

yarn install 명령어를 실행하면 종속성 여부와 관계없이 가능한 모든 패키지를 동시에 설치한다.

yarn은 yarn.lock 파일을 통해 패키지 버전의 고정을 보장한다. 이 파일에는 모든 패키지의 버전 정보가 기록되며, 이를 통해 설치 시 일관된 환경을 유지할 수 있다.

 

하지만, yarn을 사용하면 운영(배포)환경에서 메모리 사용 이슈가 발생할 수 있다.

yarn은 모든 패키지를 병렬로 설치하기 때문에 설치 과정에서 많은 메모리가 소모될 수 있다. 특히 대규모 프로젝트에서는 패키지 의존성이 복잡하고, 설치할 패키지 수가 많기 때문에 메모리 사용량이 증가할 가능성이 높다.

CI/CD 파이프라인에서 빌드 단계에서 메모리 문제가 자주 발생한다.

CI/CD 환경에서는 배포 서버에서 빌드를 수행하는 경우가 많다. 이 과정에서 yarn이 병렬로 많은 패키지를 설치하면 메모리 사용량이 높아지고, 서버의 메모리 한계를 초과할 수 있다. 메모리 초과로 인해 빌드가 실패하거나 서버가 다운되는 문제가 발생할 수 있다.

 

 

#4. pnpm

pnpm은 성능을 중시하며 저장 공간 효율성을 높이기 위해 개발된 패키지 매니저이다.

대규모 프로젝트와 모노레포 환경에서 강력한 성능을 발휘하는 최신 패키지 매니저로, 빠른 설치 속도와 저장 공간 절약을 중점으로 설계된 것이 특징이다.

 

◼︎ pnpm store : 중앙 저장소

pnpm은 pnpm store라는 중앙 저장소에 모든 패키지를 다운로드한다.

이를 통해 한 번 설치된 패키지는 다시 다운로드하지 않고 재사용 할 수 있다. 예를 들어, A 프로젝트에서 axios를 설치한 후, B 프로젝트에서 동일한 axios 패키지를 설치하면, 네트워크 요청 없이 pnpm store에 있는 패키지를 바로 사용하게 된다. 이 방식은 설치 시간을 단축하고 네트워크 사용량을 줄이며, 저장 공간을 절약할 수 있게 한다.

pnpm store는 보통 ~/.pnpm-store 경로에 위치한다. 이곳에 모든 패키지가 저장되며, 심볼릭 링크를 통해 각 프로젝트에서 이 패키지를 공유하게 된다.

 

 

◼︎ 심볼릭 링크를 통한 효율적인 저장

npm과 yarn은 패키지를 설치할 때, 각 프로젝트의 node_modules 폴더에 패키지를 개별적으로 복사한다. 이 방식은 패키지가 중복 설치되어 저장 공간이 낭비될 수 있다.

반면, pnpm은 node_modules 폴더에 심볼릭 링크를 사용하여 pnpm store에 있는 패키지로 연결한다.

따라서 여러 프로젝트에서 동일한 패키지를 사용할 때, 중복 설치를 방지할 수 있으며, 저장 공간을 크게 절약할 수 있다.

심볼릭 링크란?
: 실제 파일이 아닌, 파일의 경로를 가리키는 가상 파일이다. 이를 통해 하나의 패키지가 여러 프로젝트에서 공유되며, 공간 낭비를 최소화한다.

반응형