패키지 매니저란?
소프트웨어 개발 과정에서 라이브러리나 프레임워크와 같은 외부 패키지 관리를 용이하게 해주는 도구로, 이를 통해 패키지의 설치, 업데이트, 삭제 등을 쉽고 효율적으로 관리할 수 있다.
Node.js 환경에서 가장 널리 사용되는 패키지 매니저는 Node.js의 기본 패키지 매니저인 npm(node package manager) 이외에도 yarn, pnpm과 같은 다양한 패키지 매니저가 사용되고 있다.
npm, yarn, pnpm 비교하기
이들 모두 Node.js 환경에서 사용되는 패키지 매니저지만 각 패키지 매니저는 독자적인 설계 철학과 목표를 가지고 개발되었기 때문에 내부 동작 방식과 제공하는 기능에서 차이가 있다.
npm
- 가장 널리 사용되는 패키지 매니저로 커뮤니티와 패키지 수가 아주 많다.
- 생태계가 풍부하기 때문에 다른 유저들이 만들어 놓은 다양한 모듈을 쉽게 사용할 수 있다.
- Node.js와 함께 기본으로 설치되어 별도로 설치할 필요가 없다.
- npx 명령어를 통해 패키지를 실행할 수 있다.
단, 설치 속도가 비교적 느리다는 단점이 있다. (npm은 한 번에 하나씩 순차적으로 설치한다.)
또한 npm은 패키지의 의존성 관리를 위해 package.json 파일에 명시된 모든 패키지를 별도로 설치한다. 이 과정에서 공유된 의존성이 중복으로 설치되면서 패키지 속도가 느려지고, 디스크 공간을 많이 차지하게 된다.
=> npm 5 이상에서는 package-lock.json으로 설치 속도를 최적화하고 병럴 설치 기능도 추가되었다고 한다.
package.json은 프로젝트 전반의 설정과 정보가 담겨 있다. 프로젝트 이름이나 스크립트, 의존성 목록 등을 말한다.
package-lock.json는 의존성 트리의 정확한 버전을 기록한다. 동일한 의존성 버전이 모든 환경에서 설치되도록 보장한다.
yarn
- npm의 단점을 보완하기 위해 Facebook에서 개발해 보안과 성능이 향상되었다.
- npm은 자동으로 패키지에 포함된 다른 패키지 코드를 실행하는데 이로 인해 보안 시스템에 취약점이 발생할 수 있다.
- 반면 yarn은 yarn.lock에 있는 파일만을 설치한다.
- 병렬 설치를 통해 속도가 빠르다. (npm과 달리 여러 패키지를 동시에 가져와 설치하도록 최적화됨)
- yarn.lock으로 일관성 있는 설치를 보장한다.
- 새로운 팀원이 프로젝트를 클론하고 yarn install을 실행하면 정확히 같은 패키지가 설치되도록 보장한다.
- 의존성 트리를 정확하게 기록해서 중첩된 의존성의 일관성을 유지한다.
yarn classic(1.x)과 yarn berry(2.x)은 상당한 차이가 있기 때문에 다른 포스팅에서 다루겠다.
pnpm
- 효율적인 npm을 뜻하는 패키지 매니저로, 설치 속도가 매우 빠르고 패키지를 중복 없이 설치한다.
- npm을 사용할 때 종속성을 사용하는 프로젝트가 100개 있는 경우 해당 종속성의 사본 100개가 디스크에 저장되지만 pnpm을 사용하면 의존성이 content-addressable 저장소(전역 저장소)에 저장된다.
- 다른 버전의 의존성에 의존하는 경우 다른 파일만 저장소에 추가된다. 즉 100개의 파일이 있고 새 버전에 그 중 1개의 파일만 변경된다면 pnpm은 1개의 파일 변경을 위해 전체 종속성을 복제하는 것이 아니라 스토어에 새 파일 1개만 추가한다.
- 의존성 패키지는 전역 저장소에 저장되어 각 프로젝트에서는 이 저장소를 참조한다.
- 패키지를 한 번만 다운하고 여러 프로젝트에서 공유하기에 설치 속도가 빠르다.
- pnpm은 3가지 단계로 설치를 간소화한다.
- 1번째, 종속성 해결: 필요한 모든 종속성을 식별해 스토어로 가져온다.
- 2번째, 디렉토리 구조 계산: 종속성을 기반으로 node_modules 디렉토리 구조가 계산된다.
- 3번째 종속성 연결: 나머지 모든 종속성을 가져와 스토어에서 node_modules로 하드링크(2개 이상의 파일 이름이 동일한 데이터 블록을 참조하도록 만드는 기술 - 의존성 파일들을 실제로 복사하지 않고 하나의 스토어에 있는 파일을 여러 프로젝트에서 참조하도록 한다고 이해하면 될 것 같다.) 한다.
- pnpm의 방식은 전통적인 방식(종속성 확인 - 종속성 가져오기 - node_modules에 작성하는)보다 훨씬 빠르다.
- npm을 사용할 때 종속성을 사용하는 프로젝트가 100개 있는 경우 해당 종속성의 사본 100개가 디스크에 저장되지만 pnpm을 사용하면 의존성이 content-addressable 저장소(전역 저장소)에 저장된다.
- pnpm-lock.yaml 파일로 프로젝트마다 동일한 의존성을 보장한다.
요약
- Isolated node_modules: 각 프로젝트의 node_modules 디렉토리가 독립적으로 관리되는 방식
- 각 프로젝트가 자체적으로 해당 디렉토리를 가지고 있어 A 프로젝트의 의존성이 다른 프로젝트에 영향을 미치지 않는다.
- Hoisted node_modules: 공통 의존성을 루트 수준으로 끌어올려 관리하는 방식
- 예를 들어 모노레포 구조에서 여러 패키지가 동일 의존성을 공유할 때 이 의존성을 각 패키지의 node_modules 디렉토리에 개별적으로 설치하는 대신 루트 node_modules 디렉토리에 한 번만 설치해 디스크 사용량을 줄이고 의존성 설치 속도 향상 및 중복된 패키지 설치를 방지한다.
- Plug'n'Play: yarn berry에서 도입된 새로운 의존성 관리 방식
- 전통적인 node_modules 디렉토리 구조가 아니라 의존성을 직접 zip 파일에서 로드해 디스크 사용량을 줄이고 의존성 설치 속도를 극대화 한다.
- Zero-install: 프로젝트 클론 후 별도의 패키지 설치 과정 없이 즉시 개발 환경을 시작할 수 있는 방식
- 프로젝트의 모든 의존성을 버전 관리 시스템(git)에 포함 시켜 저장한다.
- yarn berry의 PnP와 함께 사용되며 node_modules 디렉토리 대신 .yarn/cache 폴더에 패키지 아카이브를 저장해 프로젝트 클론 후 바로 시작할 수 있다. 이를 통해 설정 시간을 절약하고 프로젝트 환경을 일관되게 유지한다.
들어봤던 개념들만 다시 검색해봤고 나머지 항목들은 잘 몰라서 일단 패스...
이번에 진행하는 디프만 프로젝트에서는 거의 모든 면에서 기술적인 도전을 하게 됐다. NEXT부터 PandaCSS, RN에 이어 패키지 매니저까지... 패키지 매니저는 그나마 이중에서 제일 빠르게 이해할 수 있는 부분 같아서 공식 문서를 참고해 정리해봤다.
팀원들에 비해 경험이 부족해서 기술들을 새로 익히는데 좀 어려움이 있다. 그래서 어떤 기술을 도입하자고 했을 때 그 기술의 배경, 장단점을 모르니 쉽게 의견을 내기 어려웠다. 🥲 pnpm이 뭔지도 모르고, 이것의 장점이 무엇인지 이야기 할 때 잘 이해를 못 했는데 조금 이해했다! 부지런히 따라가보자 🍀
참고
'👋🏻 JavaScript' 카테고리의 다른 글
[JS] CSS transition (4) | 2024.10.03 |
---|---|
[JavaScript] 클래스 (1) | 2023.12.21 |
[JS] json-server로 만드는 프론트엔드 연습용 가짜 서버 (0) | 2023.08.02 |