Yarn Berry를 왜 사용했는가?

Yarn Berry는 npm과 비교하여 여러 가지 장점을 제공하는 패키지 매니저입니다. 특히 대규모 프로젝트에서 효율성을 극대화할 수 있는 다양한 기능을 제공하지만, 일부 호환성 문제를 고려해야 합니다. Yarn Berry를 도입하려는 팀은 이러한 장점과 단점을 잘 고려하여 선택하는 것이 좋습니다.

얼마 전 2023 ‘토스’ 윈터 인턴 채용에서 패키지 매니저로 Yarn Berry를 사용한다고 명시되어 있었습니다. 그때부터 궁금증이 생겼습니다. 처음 공부할 때는 Node.js에서 제공하는 npm을 사용했고, 이후 멋사 6기 프론트엔드 스쿨에서 pnpm을 사용했습니다. Yarn이라는 패키지 매니저가 존재한다는 것은 알았지만, Yarn Berry는 생소했습니다. 이번 기회에 Yarn을 사용해볼 겸 패키지를 Yarn Berry로 구성해보려 합니다.


Yarn을 알기 전, npm부터 알아보자!

npm의 등장과 한계

npm은 Node.js의 기본 패키지 매니저로, 오랜 기간 동안 많은 개발자들에게 사랑받아왔습니다. 하지만 npm도 몇 가지 단점을 가지고 있습니다.

  1. 성능 및 설치 속도(순차적 설치)

    • npm은 패키지를 순차적으로 설치하기 때문에 대규모 프로젝트에서는 설치 속도가 느려지는 문제가 있습니다.
  2. 보안성 취약

    • 초기 npm은 package-lock.json 파일이 없어 의존성 충돌이 자주 발생했습니다. 이로 인해 같은 프로젝트에서 개발 환경이 달라질 수 있었습니다.

Yarn의 등장

Yarn은 npm의 이러한 단점을 보완하기 위해 Facebook에서 개발된 패키지 매니저입니다.

  • 캐싱 기능: Yarn은 패키지를 캐싱하여 중복 다운로드를 방지합니다.
  • 병렬 설치: Yarn은 패키지를 병렬로 설치하여 설치 속도를 크게 개선합니다.
  • yarn.lock 파일: 모든 디바이스에서 동일한 패키지 버전을 설치하여 버전 충돌 문제를 방지합니다.

현재 npm도 package-lock.json 파일을 제공하여 이러한 문제를 해결했지만, Yarn은 여전히 캐싱과 병렬 설치 등의 기능으로 더 나은 성능을 제공합니다.


Yarn Berry

Yarn의 두 번째 버전인 Yarn Berry는 2020년에 발표되었습니다. Yarn Berry는 패키지 관리 방식을 혁신적으로 개선하여 Plug'n'Play(PnP)라는 새로운 방식을 도입했습니다.

Plug’n’Play(PnP)

기존의 패키지 관리 방식에서는 패키지를 프로젝트의 node_modules 디렉토리에 저장했습니다. 하지만 PnP는 패키지를 .zip 파일로 압축하여 .yarn/cache 폴더에 저장하고, 패키지 위치 정보를 .pnp.cjs 파일에 기록합니다.

이 방식의 장점은 다음과 같습니다:

  1. 성능 개선: 패키지 위치를 빠르게 찾을 수 있어 설치 시간이 단축됩니다.
  2. 중복 설치 방지: 같은 패키지를 여러 번 설치하지 않으므로 스토리지 용량이 절약됩니다.
  3. node_modules 제거: node_modules 디렉토리가 필요 없어지며, 이로 인해 GitHub에 의존성을 포함시킬 수 있습니다.

Zero-Install

Yarn Berry는 zero-install을 지원합니다. 즉, git clone 이후 별도의 설치 없이 프로젝트를 바로 사용할 수 있습니다. 브랜치 변경 시에도 필요한 의존성 패키지가 이미 존재하므로 yarn install 없이 프로젝트를 실행할 수 있습니다.

스토리지 효율성

패키지를 .zip 파일로 압축하여 저장하기 때문에, 스토리지 용량을 크게 절약할 수 있습니다. 예를 들어, npm을 사용할 때는 node_modules 디렉토리가 약 400MB를 차지했지만, Yarn PnP를 사용하면 의존성 디렉토리 크기가 120MB에 불과합니다.


Yarn Berry 사용 후기와 문제점

Yarn Berry를 사용하면서 몇 가지 문제를 경험했습니다. 그 중 하나는 Jest와의 호환성 문제였습니다.

Jest 호환성 문제

Yarn Berry에서 Jest를 사용하려고 할 때, 아래와 같은 에러 메시지가 발생했습니다.

Jest 에러 메시지

이 에러는 Jest 버전 5에서 발생하는 호환성 문제로 보입니다. 이 문제를 해결하기 위해 Jest를 4버전으로 내리니 정상적으로 동작했습니다.

Yarn Berry의 장점

  • Zero-Install: 별도의 설치 과정 없이 프로젝트를 바로 실행할 수 있어 편리합니다.
  • 빠른 설치 속도: 병렬 설치와 캐싱 기능 덕분에 설치 속도가 빠릅니다.
  • 스토리지 절약: 압축된 패키지로 인해 스토리지 사용량이 적습니다.

Yarn Berry의 단점

  • 호환성 문제: 일부 라이브러리와의 호환성 문제가 발생할 수 있습니다.
  • 학습 곡선: 새로운 개념(PnP, Zero-Install 등)을 익혀야 하므로 처음 사용하기에는 다소 어렵습니다.


결론

Yarn Berry는 npm과 비교하여 여러 가지 장점을 제공하는 패키지 매니저입니다. 특히 대규모 프로젝트에서 효율성을 극대화할 수 있는 다양한 기능을 제공하지만, 일부 호환성 문제를 고려해야 합니다. Yarn Berry를 도입하려는 팀은 이러한 장점과 단점을 잘 고려하여 선택하는 것이 좋습니다.