패키지 매니저

김강민·2024년 4월 30일
0

개발

목록 보기
4/16

1. 패키지 매니저란?

자바스크립트 프로젝트를 개발한다면 패키지 매니저를 사용하게 된다. 이 때 자바스크립트 패키지 매니저는 자바스크립트 프로젝트에서 사용되는 의존성 관리 도구이다.
패키지 매니저는 프로젝트에 필요한 의부 라이브러리, 모듈, 플러그인 등을 손쉽게 설치하고 관리하는 역할을 한다.

패키지란?

  • 라이브러리가 코드의 묶음이라면, 패키지는 코드의 배표를 위해 사용되는 코드의 묶음
  • 라이브러리나 실행 파일을 포함

2. 주요 기능

1. 패키지 설치

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

2. 의존성 관리

패키지 매니저는 프로젝트의 의존성을 관리한다. 패키지는 다른 패키지에 의존할 수 있으며, 패키지 매니저는 이러한 의존성을 자동으로 해결하여 필요한 패키지들을 설치한다.

3. 버전 관리

패키지 매니저는 패키지의 다양한 버전을 관리한다. 이를 통해 특정 버전의 패키지를 설치하거나 업데이트할 수 있으며, 프로젝트가 정확한 버전의 패키지를 사용하도록 보장할 수 있다.

4. 스크립트 실행

패키지 매니저는 프로젝트에 미리 정의된 스크립트를 실행하는 기능을 제공한다. 이를 통해 빌드, 테스트, 배포 등의 자동화된 작업을 수행할 수 있다.

자바스크립트 패키지 매니저는 자바스크립트 프로젝트에서 필수적인 도구로, 의존성 관리와 프로젝트 구축을 더욱 간편하고 효율적으로 만들어 준다.

가장 대표적인 자바스크립트 패키지 매니저로는 npm, yarn, pnpm, yarn berry 등이 있다.

3. 대표적인 패키지매니저들의 특징

01. npm (Node Package Manager)

특징

Node.js의 공식 패키지 관리자이며, Node.js를 설치하면 기본적으로 같이 설치되기 때문에 많이 사용한다. 따라서 많은 개발자들이 널리 사용하고 있다.

npm에는 직접 개발한 모듈뿐만 아니라 다른 사용자들이 만들어 놓은 여러가지 모듈을 다운받아서 사용 가능하다는 특징이 있다.
강력한 CLI(Command Line Interface)를 제공하여 패키지 설치, 버전 관리, 의존성 해결 등의 기능을 수행한다.

차이점

패키지 설치 시 패키지들을 각각 별도로 설피한다. 이로 인해 공유된 의존성이 중복으로 설치될 수 있다.
의존성 트리가 깊어질수록 패키지 설치 속도가 느려지고, 디스크 공간을 많이 차지할 수 있다.

02. yarn (Yet Another Resource Negotiator)

yarn?

2016년에 Facebook에서 개발한 패키지 매니저, npm과 비슷한 목적을 가지고 있다. npm의 단점을 보완하고, 더 나은 성능과 안정성을 제공하며, 여러 개의 패키지를 병렬로 설치하여 빠른 속도를 보장한다. yarn.lock 파일을 사용해 의존성을 더욱 확실히 관리한다.

현재는 yarn2, yarn Berry, yarn3.x로 볼리는데 다 똑같은 것을 의미하며 일반적인 yarn은 yarn2를 의미한다.

특징

1. node_modules
npm의 경우 node_modules 디렉토리로 모든 패키지를 관리한다. 그렇기 때문에 node_modules 디렉토리 구조는 프로젝트에서 매우 큰 용량을 차지하며 이러한 디렉토리 구조를 만들기 위해 많은 I/O 작업이 필요하다. 또한 파일 시스템을 통해 중첩된 node_modules 디렉토리를 찾아 올라가면서 패키지를 찾아 올라가면서 패키지를 하기 때문에 패키지를 찾는 과정이 엄청나게 비효율적이다.

2. Plug'n'Play(PnP)
Yarn2에서는 위의 문제점을 PnP를 이용해 해결한다.

Yarn2는 node_modules 를 생성하지 않고, .yarn/cache 폴더에 의존성의 정보를 저장하고 .pnp.cjs 파일에 의존성을 찾을 수 있는 정보를 기록한다. .pnp.cjs 파일을 이용하면 디스크 I/O 없이 어떤 패키지가 어떤 라이브러리에 의존하는지, 각 라이브러리는 어디 위치하는지 바로 알 수 있다.

패키지 매니저는 의존성 트리를 생성할 때 이미 모든 의존성에 대한 정보를 알고 있으니, 패키지를 찾는 작업을 Node에게 맡기지 않고 정보를 제공하는 것이다. .pnp.cjs 파일에는 패키지들에 대한 lookup 테이블로 볼 수 있다.

이제 Yarn2는 install시 단 하나의 파일만 생성하면 된다. 설치 시간의 관건이 디스크 I/O가 아닌 프로젝트에서 사용하는 패키지의 개수가 되는 것이다.

3.ZipFS
Yarn PnP의 의존성은 .yarn/cache 에 zip 압축 파일로 관리된다.

Zip 파일로 의존성을 관리하면 디렉토리 구조를 생성할 필요가 없기 때문에 설치가 빨라지고, 각 패키지는 버전마다 하나의 파일을 가지기 때문에 중복해서 설치되지 않는다. 또한 압축파일인 만큼 디스크 용량도 크게 아낄 수 있다.

용량이 작기 때문에 이제 의존성도 git으로 관리할 수 있다. Pull만 받으면 install 과정없이 바로 같은 환경을 세팅할 수 있는 것이다. Yarn2에서 의존성을 버전 관리에 포함하는 것을 'Zero-Install'이라고 한다.

차이점

여러 패키지를 동시에 가져오고 설치하도록 최적화되어 있어 npm보다 빠른 의존성 설치 속도와 패키지 버전 관리를 제공한다.
yarn.lock 파일을 사용하여 의존성 트리를 고정시켜 재현 가능한 빌드를 지원한다. 캐시 기능을 제공하여 패키지 다운로드를 최적화한다.

03. pnpm (Performant npm)

특징

npm의 의존성 문제를 해결하기 위해 고안된 패키지 매니저로, 고유 설치와 플랫 노드 모듈을 통해 의존성 관리를 최적화한다.
다중 설치를 피하여 저장 공간을 절약할 수 있다.

차이점

npm과 달리 의존성을 고유하여 저장 공간을 최적화한다. Flat node_modules 구조를 사용해 파일 시스템의 깊이를 줄이고 의존성 트리를 단순화한다. 동시 설치 기능을 지원하여 의존성 설치 속도를 향상시킨다.

04. yarn berry

특징

Yarn의 새로운 버전으로, 다중 패키지 프로젝트를 위한 기능을 강화한 패키지 매니저다. Zero-install과 Plug'n'Play를 통해 의존성 설치 속도를 향상시키고 저장 공간을 절약한다. Workspaces 기능을 제공하여 여러 패키지를 하나의 저장소로 관리할 수 있다.

차이점

Zero-install 기능을 통해 의존성을 로컬에 별도로 설치하지 않고 필요한 시점에서 즉석 사용한다.
Plug'n'Play를 통해 가상 파일 시스템을 사용하여 의존성 설치를 최적화한다. Workspaces 기능을 통해 모노레포 형식의 프로젝트를 관리할 수 있다.

profile
인생은 프레임워크처럼, 공부는 라이브러리처럼

0개의 댓글

관련 채용 정보