npm과 yarn은 자바스크립트 런타임 환경인 노드의 패키지 관리자임.
전 세계의 개발자들이 자바스크립트로 만든 다양한 패키지를 npm 온라인 데이터베이스에 올리면 npm, yarn과 같은 패키지 관리자를 통해 설치 및 삭제 가능하다. 그리고 명령 줄 인터페이스(Command-line interface, CLI)를 통해 패키지 설치 및 삭제뿐 아니라 패키지 버전 관리, 의존성 관리도 편리하게 할 수 있다.
노드 패키지 매니저(Node Package Manager)의 줄임말로 노드를 설치할 때 자동으로 설치되는 기본 패키지 관리자입니다. 크게 두 가지 역할을 수행
첫 번째 역할은 온라인 플랫폼, 사람들이 노드 패키지를 만들고, 업로드하고, 공유할 수 있는 공간으로 누구나 온라임 플랫폼에 게시된 패키지를 사용할 수 있다.
두 번째 역할은 명령 줄 인터페이스, 온라인 플랫폼과 상호 작용하기 위해 명령 줄 인터페이스를 사용하여 패키지 설치 및 제거 가능
노드를 다운로드하면 npm이 자동으로 설치 됨.
node -v
npm -v
yarn은 2106년 페이스북에서 개발한 패키지 관리자임. 리액트와 같은 프로젝트를 진행하며 겪었던 어려움을 해결하기 위해 개발되었고, npm 레지스트리와 호환하면서 속도나 안정성 측면에서 npm 보다 향상 됨.
yarn은 npm을 통해 설치 가능
npm install yarn --global
맥 사용자라면 brew를 통해 설치도 할 수 있다.
brew update
brew install yarn
npm과 yarn의 주요 차이점 중 하나는 패키지 설치 프로세스를 처리하는 방법이다.
npm의 경우 패키지를 한 번에 하나씩 순차적으로 설치하고, 그에 비해 yarn은 여러 패키지를 동시에 가져오고 설치하도록 최적화되어 있어 yarn이 npm보다 빠르다.
yarn은 보안 측면에서 npm보다 안전한 것으로 알려져 있다. npm은 자동으로 패키지에 포함된 다른 패키지 코드를 실행 이로 인해 보안 시스템에 몇 가지 취약성이 발생하며 나중에 심각한 문제가 발생할 수 있다. 반면에 yarn은 yarn.lock 또는 package.json파일에 있는 파일만을 설치한다. 하지만 현재에 이르러서는 npm 또한 많은 업데이트를 통해 보안 업데이트도 크게 향상되었다.
모노레포 프론트엔드 아키첵터로 프로젝트 세팅 하는 과정에서 yarn을 도입하면서 version 1로 init을 하는 과정에서 다양한 error 또는 version으로 인한 에러를 발생하게 되었다.
그래서 Yarn Berry를 검토하게 되었고 이 버전을 통해 초기 프로젝트 세팅을 하기로 결정하였다.
Yarn Berry는 Node.js를 위한 새로운 패키지 관리 시스템으로, yarn v1의 주요 개발자인
Maël Nison씨가 만들었다. 2020년 1월 25일부터 정식 버전(v2)가 출시되어, 현재는 Babel과 같은 큰 오픈소스 레포지토리에서도 채택하고 있다. Yarn Berry는 GitHub yarnpkg/berry 레포지토리에서 소스코드가 관리되고 있습니다.
Yarn Berry는 기존의 "깨져 있는" NPM 패키지 관리 시스템을 혁신적으로 개선합니다.
어떤 프로젝트를 구성하는 의존성은 결정적이다. Berry는 node_modules에 패키지 파일을 저장하는 대신 패키지의 압축 파일을 ./yarn/cache 폴더에 수평적으로 저장하는 방식으로 위 문제를 해결 했다. 이 방식을 Yarn은 Plyg’n’Play(PnP)라고 부른다. 압축 파일은 ZipFs를 이용하여 해당 모듈 로드가 필요할 때 메모리에서 압축을 해제하여 접근한다.
하나의 압축 파일로 의존성을 관리하고 이 파일을 git으로 관리하면 설치 과정을 제거할 수 있는데 이와 같은 전략을 zero-install이라 한다. 이 전략의 장점은 다음과 같다.
//.yarnrc.yml
nodeLinker: "pnp" // pnp(default), pnpm, node_modules 중 설정 가능.
아래 설정을 통해 node_modules로 패키지를 관리하겠다는 것을 정의
//.yarnrc.yml
nodeLinker: node-modules
기존의 프로젝트로 막상 yarn berry 버전에서 pnp를 이용해보면 예상과는 다르게 정상적으로 동작하지 않고 디펜던시 관련 에러가 발생
각 모듈이 pnp로 사용할 수 있으려면, pnp 방식에 맞게 의존성 관리가 strict하게 세팅되어 있어야 한다. 그러나 모든 모듈이 pnp 형태에 맞게 호환이 모두 되어 있는 상태가 아니기 때문에, pnp를 제대로 사용하기에는 아직 많은 문제가 발생
이로 인해 Yarn에서도 완전히 strict한 방식 대신, pnp loose 모드를 통해 명시적으로 요구하는 디펜던시를 요구하지 않도록 할 수 있다.
// .yarnrc.yml
pnpMode: loose
그러나 이는 pnp가 정상적으로 동작하는 것을 보장하지 않는다. 따라서 왠만하면 pnp 모드를 이용하려면 strict 모드로 이용하는 것이 좋다.
아무튼, 위에서 설명한 것처럼 각 의존성 모듈이 zip 아카이브 파일로 독립적으로 관리가 됨으로써, 의존성 트리가 더욱 strict 하게 관리가 필요하다. 따라서 pnp 형식으로 관리될 때는 이러한 의존성 모듈 관리에 대해 문제되는 부분을 모두 해결해주어야만 정상적으로 pnp 방식으로 모듈을 이용할 수 있게 된다.
//zero-install
.yarn/*
!.yarn/cache
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions
// 미사용 시
.pnp.*
.yarn/*
!.yarn/cache
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions
yarn dlx @yarnpkg/sdks vscode
yarn과 npm은 둘 모두 종속성 관리하고 패키지를 관리하게 적합하고 좋은 툴이고 지속적인 업데이트를 통해 둘 모두 큰 차이가 없습니다. yarn berry를 이용 할 경우 node_modules에서 패키지 종속성 관리를 통해 일어나는 문제점들을 zero-install을 통해 방지할 수 있습니다. 허나 위에 있는 내용처럼 pnp을 이용하여 관리하는 경우 디펜던시 관련 에러가 발생하는 경우 있습니다. 이와 같은 에러를 해결하기 위해서도 적지 않은 시간을 소비해야 합니다.