패키지 매니저 및 모노레포 정하기

목차

패키지 매니저

패키지 매니저의 등장 배경부터 시작하여 npm, Yarn, pnpm, Yarn Berry의 특징과 장단점을 분석하고, 팀 프로젝트에 가장 적합한 패키지 매니저를 선택한 이유를 제시합니다.

패키지 매니저의 등장 배경

  • 의존성 관리의 복잡성 증가
  • 일관된 개발 환경 필요
  • 배포 및 업데이트의 효율성

일반적으로 package.json 파일에 디펜던시를 명시하고, npm install 혹은 yarn install을 하면, 해당 의존성의 명시된 버전을 설치하게 됩니다. 즉, 패키지 매니저는 모호한 버저닝 문제를 해결해줍니다.

패키지 매니저가 동작하는 세 단계

Resolution 단계

  • 라이브러리 버전 고정
  • 라이브러리의 다른 의존성 확인
  • 라이브러리의 다른 의존성 버전 고정

Fetch 단계

  • 결정된 버전의 파일을 다운로드 하는 과정
  • Resolution/Fetch 된 라이브러리를 소스 코드에서 사용할 수 있는 환경을 제공하는 과정

npm (Node Package Manager)

장점

  • 광범위한 생태계: 수백만 개의 패키지를 제공하여 다양한 기능을 손쉽게 구현 가능
  • 활발한 커뮤니티: 풍부한 자료와 지원을 받을 수 있음

단점

  • 느린 설치 속도: 대규모 프로젝트에서 설치 시간이 길어질 수 있음
  • 의존성 트리의 중복: 동일한 패키지가 여러 버전으로 설치되어 디스크 공간을 비효율적으로 사용

    0image.png

    1image.png

yarn

Yarn은 Facebook에서 npm의 단점을 보완하기 위해 개발한 패키지 매니저로, 속도와 일관성에 초점을 맞추고 있습니다.

장점

  • 빠른 설치 속도: 병렬 다운로드와 캐싱을 통해 설치 시간을 단축
  • 신뢰성 있는 버전 관리: yarn.lock 파일을 통해 의존성 버전을 고정하여 일관성 유지
  • 효율적인 네트워크 사용: 동일한 패키지를 재사용하여 네트워크 트래픽 감소

단점

  • 호환성 이슈: 일부 패키지가 Yarn과 완벽히 호환되지 않을 수 있음

pnpm

pnpm은 패키지를 설치할 때 하드 링크와 심볼릭 링크를 활용하여 디스크 공간을 절약하는 패키지 매니저입니다.

장점

  • 디스크 공간 효율성: 동일한 패키지를 한 곳에 저장하여 중복 제거
  • 빠른 설치 속도: 파일 시스템 링크를 사용하여 설치 시간을 단축
  • 엄격한 의존성 격리: 프로젝트별로 의존성을 격리하여 충돌 방지

단점

  • 호환성 문제: 일부 도구나 스크립트가 pnpm의 구조를 지원하지 않을 수 있음

Yarn Berry (Yarn 2)

Yarn Berry는 Yarn의 두 번째 메이저 버전으로, Plug’n’Play(PnP) 시스템을 도입하여 node_modules 폴더 없이 패키지를 관리합니다.

장점

  • 향상된 성능: PnP를 통해 모듈 해결 시간을 단축
  • 보안 강화: 의존성 접근을 엄격히 통제하여 보안성 향상
  • 구성 가능성: 다양한 플러그인과 설정을 통해 커스터마이징 가능

단점

  • 호환성 이슈: PnP를 지원하지 않는 패키지나 도구가 존재
  • 학습 곡선: 기존 Yarn과 달라진 점이 많아 학습 필요
  • 설정 복잡성: 초기 설정과 환경 구성이 복잡할 수 있음

패키지 매니저 비교 및 선택

패키지 매니저 설치 속도 디스크 공간 효율성 호환성 학습 난이도
npm 느림 낮음 높음 낮음
Yarn 빠름 중간 높음 중간
pnpm 매우 빠름 높음 중간 중간
Yarn Berry 빠름 높음 낮음 높음

2%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2024-10-31%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_3.03.23.png_

PnP vs. Zero-install

PnP는 node_modules 없이 JavaScript Map 객체를 활용해 의존성을 엄격하고 빠르게 관리하는 접근 방식입니다. 그리고 Zero-install은 PnP의 JavaScript Map 객체와 Fetch된 의존성들까지 모두 Git에 넣어 버전을 관리하자는 방식입니다.

쉽게 말해, npm을 사용하면서 node_modules 디렉토리를 버전 관리하는 것이 Zero-install이죠.

3image.png

우리 프로젝트는 모노레포 구조로 구현되며, 동일한 환경에서 동작할 수 있도록 제로 인스톨을 채택하기로 결정하였습니다.

  1. 모노레포 지원: 프로젝트가 다수의 패키지로 구성된 모노레포 구조이므로, 여러 패키지를 효율적으로 관리할 수 있는 워크스페이스 기능이 필수적입니다. Yarn Workspaces와 pnpm Workspaces는 이를 효과적으로 지원하지만, Yarn Berry는 더욱 향상된 모노레포 관리 기능을 제공합니다.
  2. 제로 인스톨: 개발 환경 설정을 단순화하고 초기 설치 단계를 제거하기 위해 제로 인스톨 방식을 도입하였습니다. Yarn Berry의 Plug’n’Play(PnP) 기능은 node_modules 폴더 없이 패키지를 관리할 수 있어 제로 인스톨을 구현하는 데 최적입니다.
  3. 디스크 공간 및 설치 속도: 대규모 모노레포에서는 디스크 공간 사용과 설치 속도가 중요한 요소입니다. Yarn Berry와 pnpm은 디스크 공간을 효율적으로 사용하며 빠른 설치 속도를 제공합니다. 특히 pnpm은 하드 링크를 활용하여 공간을 절약하지만, Yarn Berry도 PnP와 캐싱을 통해 유사한 이점을 제공합니다.

이러한 이유로, Yarn Berry가 우리 프로젝트의 요구사항에 가장 적합한 패키지 매니저로 판단되었습니다. Yarn Berry를 사용함으로써 모노레포 관리의 효율성을 높이고, 제로 인스톨을 구현하여 개발 환경 설정을 간소화하며, 빠른 설치 속도와 디스크 공간 효율성을 확보할 수 있습니다.

패키지 매니저에서 workspace의 역할

https://classic.yarnpkg.com/lang/en/docs/workspaces/

  • 여러 패키지를 설정하여 한 번만 실행하면 yarn install모든 패키지를 한 번에 설치할 수 있습니다.
  • 모든 프로젝트 종속성은 함께 설치되므로 Yarn이 이를 더 자유롭게 최적화할 수 있습니다.
  • Yarn은 프로젝트마다 다른 잠금 파일을 사용하는 대신 단일 잠금 파일을 사용하므로 충돌이 적고 검토가 수월해집니다.

참고 자료

https://www.youtube.com/watch?v=Ds7EjE8Rhjs

https://toss.tech/article/lightning-talks-package-manager

https://d2.naver.com/helloworld/0923884

https://d2.naver.com/helloworld/7553804

https://monorepo.tools/#polyrepo-concept

https://toss.tech/article/monorepo-pipeline

https://2023.stateofjs.com/ko-KR/libraries/monorepo_tools/

https://www.youtube.com/watch?v=Ix9gxqKOatY

https://www.youtube.com/watch?v=DHPeeEvDbdo

https://www.youtube.com/watch?v=Bycg5w5qXfE

https://www.youtube.com/watch?v=2IE68SDTYvI