Zero install
소프트웨어 패키지를 로컬에 설치할 필요 없이 실행할 수 있는 개념이에요.
이 방식에서는 패키지를 로컬로 완전히 다운로드하거나 설치하지 않아도, 패키지 매니저가 필요할 때 자동으로 필요한 파일을 불러와서 사용해요.
패키지 매니저에서의 Zero Install은 주로 Yarn Berry와 같은 패키지 매니저에서 제공됩니다.
장점
- 빠른 설치: 패키지 설치가 매우 빠릅니다. 필요한 의존성만 적재되고, 모든 패키지가 이미 캐시되어 있는 경우에는 거의 즉시 시작할 수 있습니다.
- 일관된 환경 보장: Zero Install은 패키지를 설치하는 과정에서 발생할 수 있는 충돌 문제를 최소화하고, 팀 프로젝트에서 환경의 일관성을 보장하는 데 유용합니다.
- 불필요한 중복 제거: node_modules처럼 거대한 폴더를 생성하지 않기 때문에 저장소의 크기를 줄일 수 있습니다.
PnP (Plug'n'Play)
PnP는 전통적인 node_modules 디렉토리 없이도 Node.js 프로젝트에서 패키지를 사용할 수 있게 해주는 기술이에요.
PnP는 패키지를 설치할 때, node_modules 폴더에 패키지를 설치하는 대신, 모든 패키지 정보를 .pnp.cjs 라는 파일에 기록합니다. 이 파일은 yarn이 의존성을 어떻게 연결하고 사용할지에 대한 지도 역할을 합니다. 런타임에 node.js 애플리케이션이 패키지를 require할 때, PnP가 이 .pnp.cjs 파일을 참조하여 의존성을 찾아줍니다.
특징
- 빠른 패키지 관리: node_modules 없이도 모든 의존성을 관리할 수 있어, 패키지 설치 속도가 빠르고 시스템 성능을 향상시킵니다.
- 강력한 모듈 해석: PnP는 의존성 트리에서 각 패키지의 정확한 위치를 추적하여 모듈 해석 충돌을 방지합니다. 전통적인 방식에서 흔히 발생하는 의존성 충돌을 해결할 수 있습니다.
- 파일 시스템 부하 감소: 수천 개의 패키지 파일을 로컬 파일 시스템에 설치하지 않으므로, 파일 시스템을 덜 사용하게 되고 그로 인해 성능도 개선됩니다.
PnP는 특히 대규모 프로젝트나 복잡한 의존성 트리에서 빛을 발하며, 의존성 문제를 미리 방지해주는 장점을 가집니다.
// 기존 node_modules 방식
project/
├── node_modules/
│ ├── packageA/
│ └── packageB/
└── package.json
// Yarn Berry PnP 방식
project/
├── .yarn/
│ ├── cache/ # 모든 패키지가 zip으로 저장
│ └── pnp.cjs # 패키지 위치 매핑 정보
└── package.json
PnP vs. Zero-install
PnP는 node_modules 없이 JavaScript Map 객체를 활용해 의존성을 엄격하고 빠르게 관리하는 접근 방식입니다. 그리고 Zero-install은 PnP의 JavaScript Map 객체와 Fetch된 의존성들까지 모두 Git에 넣어 버전을 관리하자는 방식입니다. 쉽게 말해, npm을 사용하면서 node_modules 디렉토리를 버전 관리하는 것이 Zero-install이죠.
각 패키지 매니저에 대한 설명
<aside> <img src="/icons/book-closed_lightgray.svg" alt="/icons/book-closed_lightgray.svg" width="40px" />
패키지 매니저의 역할
- 패키지 설치 및 업데이트:
- 필요한 라이브러리나 모듈을 손쉽게 설치하고, 최신 버전으로 업데이트합니다.
- 패키지 버전 관리 시스템을 통해 안정성, 보안 및 호환성을 보장합니다.
- 의존성 관리:
- 프로젝트에서 필요로 하는 모든 패키지와 그 패키지들이 요구하는 추가 의존성을 자동으로 설치하고 관리합니다.
- 의존성 충돌을 해결하며, 프로젝트 환경에 맞는 적절한 버전을 유지하도록 도와줍니다.
- 버전 관리:
- Semantic Versioning(주 버전, 부 버전, 수정 버전)을 따르며, 각 패키지의 정확한 버전을 기록해 재설치 시 동일한 환경을 재현할 수 있습니다.
- 잠금 파일(package-lock.json, yarn.lock, pnpm-lock.yaml)을 통해 패키지의 의존성과 버전을 고정하여 예측 가능한 빌드 환경을 제공합니다.
- 패키지 저장소와의 연결:
- 패키지 매니저는 공식 또는 사용자 정의 패키지 레지스트리와 통신하여 외부에서 제공하는 다양한 패키지를 쉽게 설치할 수 있도록 합니다.
- 또한 자체적인 패키지를 만들어 레지스트리에 배포하고 공유할 수 있습니다.
- 스크립트 관리:
- 프로젝트의 자동화된 작업을 정의할 수 있습니다(예: 빌드, 테스트, 배포). package.json 파일에 스크립트를 정의하여 여러 명령어를 쉽게 실행할 수 있습니다.
- 캐싱과 최적화:
- 패키지 설치 시 캐싱 기능을 통해 동일한 패키지를 재사용할 수 있도록 하여, 설치 속도와 효율을 높입니다.
- 일부 패키지 매니저는 디스크 공간 절약을 위해 하드 링크나 심볼릭 링크를 사용해 패키지를 연결합니다(pnpm 등이 대표적입니다).
- 보안 관리:
- 패키지 의존성에 보안 취약점이 있는지 스캔하고, 알려진 취약점이 있을 경우 사용자에게 경고합니다.
- npm audit 같은 기능을 통해 보안 리포트를 제공하며, 취약 패키지를 업데이트하거나 수정할 수 있는 방법을 제공합니다. </aside>