yarn berry가 무엇인가?(feat. npm vs yarn)

rondido·2024년 4월 23일
0

Javascript

목록 보기
21/21

yarn과 npm


npm과 yarn은 자바스크립트 런타임 환경인 노드의 패키지 관리자임.
전 세계의 개발자들이 자바스크립트로 만든 다양한 패키지를 npm 온라인 데이터베이스에 올리면 npm, yarn과 같은 패키지 관리자를 통해 설치 및 삭제 가능하다. 그리고 명령 줄 인터페이스(Command-line interface, CLI)를 통해 패키지 설치 및 삭제뿐 아니라 패키지 버전 관리, 의존성 관리도 편리하게 할 수 있다.

npm


노드 패키지 매니저(Node Package Manager)의 줄임말로 노드를 설치할 때 자동으로 설치되는 기본 패키지 관리자입니다. 크게 두 가지 역할을 수행

  1. 첫 번째 역할은 온라인 플랫폼, 사람들이 노드 패키지를 만들고, 업로드하고, 공유할 수 있는 공간으로 누구나 온라임 플랫폼에 게시된 패키지를 사용할 수 있다.

  2. 두 번째 역할은 명령 줄 인터페이스, 온라인 플랫폼과 상호 작용하기 위해 명령 줄 인터페이스를 사용하여 패키지 설치 및 제거 가능

설치

노드를 다운로드하면 npm이 자동으로 설치 됨.

node -v
npm -v

yarn


yarn은 2106년 페이스북에서 개발한 패키지 관리자임. 리액트와 같은 프로젝트를 진행하며 겪었던 어려움을 해결하기 위해 개발되었고, npm 레지스트리와 호환하면서 속도나 안정성 측면에서 npm 보다 향상 됨.

yarn은 npm을 통해 설치 가능

npm install yarn --global

맥 사용자라면 brew를 통해 설치도 할 수 있다.

brew update
brew install yarn

yarn vs npm


속도

npm과 yarn의 주요 차이점 중 하나는 패키지 설치 프로세스를 처리하는 방법이다.
npm의 경우 패키지를 한 번에 하나씩 순차적으로 설치하고, 그에 비해 yarn은 여러 패키지를 동시에 가져오고 설치하도록 최적화되어 있어 yarn이 npm보다 빠르다.

보안

yarn은 보안 측면에서 npm보다 안전한 것으로 알려져 있다. npm은 자동으로 패키지에 포함된 다른 패키지 코드를 실행 이로 인해 보안 시스템에 몇 가지 취약성이 발생하며 나중에 심각한 문제가 발생할 수 있다. 반면에 yarn은 yarn.lock 또는 package.json파일에 있는 파일만을 설치한다. 하지만 현재에 이르러서는 npm 또한 많은 업데이트를 통해 보안 업데이트도 크게 향상되었다.

yarn berry의 주요 특징


Yarn Berry (2.x, 3.x)

모노레포 프론트엔드 아키첵터로 프로젝트 세팅 하는 과정에서 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 패키지 관리 시스템을 혁신적으로 개선합니다.

Node_modules의 문제점

  • 의존성 탐색 알고리즘의 비효율 node.js에서 require()함수를 실행하여 모듈을 찾을 때까지 상위 node_mouldes 디렉토리를 순회한다. 이때 느린 디스크I/O 동작이 경로의 깊이만큼 발생한다.
  • 저장 공간과 설치 시간 node_modules 디렉터리는 흔히 매우 큰 공간을 필요로 하고, 그만큼 설치에도 오랜 시간이 걸린다.
  • 유령 의존성(phantom dependency) 의존성 중복 방지를 위해 호이스팅 기법을 이용하는데 이것은 의도치 않은 sdie effect를 발생시킴. 아래 그림에서 package-1은 B(1.0)을 설치한 적이 없지만 require(’b’)가 작동한다. require('B')를 사용하는 경우 B(1.0)을 의존하던 패키지를 제거하면 B를 찾지 못하는 오류가 발생한다.

Yarn Berry의 해결 방법 PnP

어떤 프로젝트를 구성하는 의존성은 결정적이다. Berry는 node_modules에 패키지 파일을 저장하는 대신 패키지의 압축 파일을 ./yarn/cache 폴더에 수평적으로 저장하는 방식으로 위 문제를 해결 했다. 이 방식을 Yarn은 Plyg’n’Play(PnP)라고 부른다. 압축 파일은 ZipFs를 이용하여 해당 모듈 로드가 필요할 때 메모리에서 압축을 해제하여 접근한다.

PnP로 얻는 것

  • 빠른 의존성 검색 의존성이 .yarn/cache에 수평적으로 존재하므로 모든 패키지에 대한 접근 시간이 O(1)이 된다. 따라서 require()에 소요되는 시간이 크게 단축된다.
  • 빠른 설치 압축 파일 단위로 설치되기 때문에 의존성을 구성하는 파일의 수가 절대적으로 감소한다. 여기에 zero-install 전략을 사용하면 아예 설치 과정을 생략할 수 있다.

  • 유령 의존성 방지 호이스팅을 사용하지 않기 때문에 의도하지 않은 의존성이 발생하지 않는다.

zero-install

하나의 압축 파일로 의존성을 관리하고 이 파일을 git으로 관리하면 설치 과정을 제거할 수 있는데 이와 같은 전략을 zero-install이라 한다. 이 전략의 장점은 다음과 같다.

  • CI 에서 의존성 설치에 드는 시간을 크게 줄일 수 있다.
//.yarnrc.yml
nodeLinker: "pnp" // pnp(default), pnpm, node_modules 중 설정 가능.

아래 설정을 통해 node_modules로 패키지를 관리하겠다는 것을 정의

//.yarnrc.yml
nodeLinker: node-modules

PnP 적용에 있어서의 문제점

기존의 프로젝트로 막상 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에 따른 gitinore 설정

//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

VSC에서 zero-install 사용 할려면 다른 설정을 진행해야 함.

yarn dlx @yarnpkg/sdks vscode

결론

yarn과 npm은 둘 모두 종속성 관리하고 패키지를 관리하게 적합하고 좋은 툴이고 지속적인 업데이트를 통해 둘 모두 큰 차이가 없습니다. yarn berry를 이용 할 경우 node_modules에서 패키지 종속성 관리를 통해 일어나는 문제점들을 zero-install을 통해 방지할 수 있습니다. 허나 위에 있는 내용처럼 pnp을 이용하여 관리하는 경우 디펜던시 관련 에러가 발생하는 경우 있습니다. 이와 같은 에러를 해결하기 위해서도 적지 않은 시간을 소비해야 합니다.

profile
개발 옆차기

0개의 댓글