<Package Manager ++ (feat. yarn berry)>

강민수·2023년 10월 22일
0

패키지 매니저

목록 보기
1/1

1. Intro.

시작에 앞서 이번에 이직한 회사에서 새롭게 알게된 개념에 대해 한 번 적어보고 깨달은 바에 대해 적어보고자 한다.

타이틀에서도 알 수 있듯이 이번 글은 NPM,YARN과 같은 패키지 매니저에 대한 얘기다.

Pakage Manager(이하 PM)이 뭔지부터 시작해서 왜 이것들을 사용하고, 각각이 어떤 장단점을 가지고 있는 지에 대해 적어보겠다.

그리고 이번에 배운 yarn-berry에 대해 조금 더 살펴보겠다.

2. Package Manager란?

위키 백과에 따르면, 정의는 다음과 같다.

패키지 관리자(package manager, 패키지 매니저), 패키지 관리 시스템(package management system)은 컴퓨터의 운영 체제를 위해 일정한 방식으로 컴퓨터 프로그램의 설치, 업그레이드, 구성, 제거 과정을 자동화하는 소프트웨어 도구들의 모임이다

즉, 간단히 생각해 보면, 우리가 흔히 쓰는 모든 라이브러리들을 모아서 관리해 주는 일종의 관리자라고 보면 된다.

그런데 여기서 한 가지 궁금해 진다.

"그렇다면 왜? 굳이? 이런 관리자를 써야 하는 거지???"

3. Package Manage를 사용하는 이유.

이를 chatgpt에게 물어봤다.

결국 당연하게도 개발자의 편의를 위해서 사용하는 부분이 가장 크다. 대표적으로 우리는 다양한 프로젝트를 협업해서 프로덕트를 만드므로, 그에 따라 개발자 마다 동일한 환경으로 함께 개발하는 것이 필요하다.

하지만, pacakge manager들이 나오기 전에는 수동으로 종속성을 관리해야만 했다. 이를 통해, 개발 시간에 보다 많은 시간이 소비되고, 종속성 해결 역시 어려움을 겪었다.(정말 이전 시대의 개발자 분들께 경의를 표한다..)

4. 그렇다면 npm은 무엇이며, npm 이전과 이후의 node 계열 개발의 종속성은?

이에 대한 답도 gpt에게 물어봤다. ㅎㅎ

물론 npm 이전에도 관리할 수 있는 툴들이 다른 언어로 존재했으나, 역시나 js기반의 node 기반 툴은 없었다. 그만큼 npm이 나온이후, 개발자들은 굳이 라이브러리 종속성 설치에 대해 신경 쓸 필요나 수고로움은 많이 준 거 같다.

5. npm vs yarn.

npm이 2010년에 출시했지만, 시간이 한 참 흘러 npm의 대항마(?) 느낌의 툴도 등장했다. 가장 대표적인 툴이 yarn이다.

그렇다면, npm과 yarn은 뭐가 다른 걸까?

npm과 yarn의 주요 차이점을 표로 정리해 보면, 다음과 같다.

npmyarn
등장 시기2010년2016년
패키지 설치npm install [패키지명]yarn add [패키지명]
패키지 전역 설치npm install -g [패키지명]yarn global add [패키지명]
패키지 제거npm uninstall [패키지명]yarn remove [패키지명]
패키지 업데이트npm update [패키지명]yarn upgrade [패키지명]
패키지 정보 확인npm show [패키지명]yarn info [패키지명]
의존성 트리 확인npm lsyarn list
패키지 검색npm search [키워드]yarn search [키워드]
패키지 초기화npm init -yyarn init -y
패키지 레지스트리 설정npm config set registry [레지스트리 URL]yarn config set registry [레지스트리 URL]
캐시 삭제npm cache cleanyarn cache clean
자동 패키지 레지스트리 업데이트npm install --registry [레지스트리 URL]yarn --registry [레지스트리 URL]
Lock 파일 이름package-lock.jsonyarn.lock
Lock 파일 포맷JSONJSON
Lock 파일의 목적의존성 트리를 고정시키기 위해 사용의존성 트리를 고정시키기 위해 사용
병렬 설치아니오예 (기본적으로 병렬 설치)
병렬 다운로드아니오예 (여러 패키지를 동시에 다운로드)
캐시 활용부분적으로 활용완전한 캐시 활용
보안패키지 무결성을 검증하기 위해 npm audit 사용패키지 무결성을 검증하기 위한 yarn audit 사용
주의 사항파일 경로의 대소문자 구분을 무시함파일 경로의 대소문자 구분을 유지함

각각의 패키지 매니저는 특징과 장단점이 있다. npm은 초기부터 많은 개발자들이 사용해왔기 때문에 생태계가 크고, 많은 패키지들이 npm 레지스트리에 호스팅되어 있다. yarn은 npm의 한계를 극복하고자 Facebook에서 만들었으며, 패키지 설치 속도와 보안 등에서 우수한 성능을 보인다. 따라서 프로젝트의 요구사항과 개발자의 취향에 따라 선택하는 것이 좋다.

6. 그렇다면 도대체 어떤 것을 선택해야 하는가?

사실 진리의 케바게가 답이다.

물론, yarn이 초기의 npm을 보완하기 위해, 안정성이나 속도 측면에서 우위를 가졌던 것이 사실이다. 하지만, 이는 초반얘기일 뿐, 현재 npm 쪽도 여러 부분에서 많은 개선을 이뤄냈다.

그래서 현재로서는 차이가 크지 않다는 것이 중론이다. 팀과 회사마다 어떤 툴을 선택할 지는 각자의 사정과 상황에 따르겠다.

7. yarn-berry?

사실 이 글을 쓴 주제의 계기이기도 한, yarn-berry.

처음에는 말만 들었지만, 실제로 회사에서 쓰고 나니, 왜 쓰는 지에 대한 이유를 알 수 있었다.

먼저, yarn-berry가 뭔지를 알아보자.

Yarn Berry는 Yarn 패키지 매니저의 새로운 버전이다. 기존 Yarn 버전과는 다르게 프로젝트의 패키지 의존성을 관리하는 방식을 변경하고 여러 가지 기능을 추가했다.

Yarn Berry의 주요 특징과 npm에 비해 가지는 장점은 다음과 같다:

  1. 플러그인 시스템:

    • Yarn Berry는 플러그인 시스템을 지원한다. 이를 통해 커스텀한 동작이나 패키지 형식을 추가하거나 확장할 수 있다.
  2. Zero-Installs:

    • Yarn Berry는 "Zero-Installs"라는 새로운 설치 방식을 도입했다. 이 방식은 전역 레지스트리에 패키지를 설치하지 않고도 프로젝트 내에 필요한 모든 의존성을 저장하고 관리한다.
  3. 향상된 성능:

    • Berry는 npm보다 빠른 패키지 설치 속도를 제공한다. 특히, 패키지 캐시를 더 효과적으로 활용하고 병렬 설치를 최적화하여 더욱 빠른 의존성 설치가 가능하다.
  4. 더 나은 신뢰성과 보안:

    • Yarn Berry는 패키지 설치의 신뢰성을 높이고 보안을 강화하는데 중점을 둔다. Lock 파일이나 패키지 해시를 이용하여 의존성 트리를 고정시키고 패키지의 무결성을 검증할 수 있다.
  5. 향상된 Workspaces 기능:

    • Workspaces는 다중 패키지 프로젝트를 관리하는데 사용되는 기능으로, Berry에서는 이 기능이 더욱 향상되었다. Workspaces를 사용하여 여러 프로젝트를 동시에 개발하거나 공유하는 것이 더욱 간편해졌다.
  6. 모노레포 지원 개선:

    • Berry는 모노레포 구성을 지원하기 위한 몇 가지 개선된 기능을 제공한다. 이를 통해 여러 프로젝트 간의 코드 공유와 관리가 더욱 용이해진다.

요약하면, Yarn Berry는 npm보다 더욱 빠르고 효율적으로 패키지를 관리할 수 있는 도구로, 특히 대규모 또는 복잡한 프로젝트에서 매우 유용하다.

8. directory 구조 비교.

추가로, directory 구조를 기존의 패키징 방식과 비교해 보겠다.

npm, yarn 기본 구조

yarn -berry 구조

가장 큰 차이는 node_modules의 부재다. 간단히만 설명하자면, 기존의 npm과 yarn은 node_modules라는 거대한 폴더 구조에서 종속성 파일들을 거대하게 가지고 있는 구조였다. 하지만, yarn-berry는 그 구조에서 벗어나, 파일들을 직접적으로 node-modules가 아닌 pnp 파일 내부에서 링킹(link로 연결하는)하는 과정을 거친다.

세부적으로 디렉토리를 분석해 보면 다음과 같다.

Yarn Berry의 디렉토리 구조를 간단한 그림으로 나타내겠다.

project-root/
├─ .yarn/                  # Yarn Berry 자체의 내부 파일 및 디렉토리
├─ .yarnrc.yml             # Yarn Berry의 설정 파일
├─ .yarnrc.yml.cacache      # Yarn Berry의 캐시 파일
├─ .pnp.js                  # Plug'n'Play (PnP) 파일 (Yarn Berry의 핵심)
├─ .pnp.cjs                 # CommonJS 형태의 PnP 파일
├─ .yarnrc.cjs              # CommonJS 형태의 Yarn Berry 설정 파일
├─ node_modules/           # 패키지 의존성이 설치되는 디렉토리 (기본적으로 없음)
├─ .pnp/                    # Plug'n'Play (PnP) 코드와 캐시가 저장되는 디렉토리
├─ .yarn/                  # Yarn Berry 관련 파일과 스크립트
│   ├─ releases/           # Yarn Berry 릴리스와 버전별 파일
│   ├─ sdks/               # Node.js 버전을 다운로드하고 사용하는 파일
│   └─ ...
├─ packages/               # Workspaces에 속하는 패키지들이 저장되는 디렉토리
│   ├─ package1/           # 패키지1
│   │   ├─ package.json
│   │   ├─ ...
│   └─ package2/           # 패키지2
│       ├─ package.json
│       ├─ ...
├─ .yarnrc.yml              # 프로젝트 전용 Yarn Berry 설정 파일 (선택 사항)
├─ .yarnrc.yml               # 프로젝트 전용 Yarn Berry 설정 파일 (선택 사항)
└─ ...

위의 디렉토리 구조는 Yarn Berry 프로젝트의 기본적인 구조를 나타낸다. 이 구조에서 중요한 부분은 다음과 같다:

  • .yarn/: Yarn Berry 자체의 내부 파일 및 디렉토리가 위치하는 곳.
  • .pnp.js 또는 .pnp.cjs: Plug'n'Play (PnP) 파일로서, Yarn Berry의 핵심적인 역할.
  • node_modules/: Yarn Berry에서는 기본적으로 사용하지 않지만, 일부 프로젝트에서는 여전히 필요할 수 있다.
  • packages/: Workspaces에 속하는 패키지들이 저장되는 디렉토리다. 각 패키지는 독립적으로 개발될 수 있다.

이는 Yarn Berry의 전체 구조를 간략하게 나타낸 것이다. 이 구조는 프로젝트에 따라 다를 수 있으며, 필요에 따라 커스터마이징할 수 있다.

9. 핵심 구조 = pnp.

위의 Yarn Berry 디렉토리 구조에서 가장 핵심적인 기능은 "Plug'n'Play" (PnP) 이다. PnP는 Yarn Berry의 핵심 기능으로, 패키지 의존성을 node_modules 디렉토리 없이도 효과적으로 관리할 수 있게 해준다. 이를 통해 프로젝트의 의존성을 더욱 효율적으로 관리하고 패키지 설치 속도를 높일 수 있다.

PnP의 핵심 아이디어는 다음과 같다:

  1. node_modules 없이 의존성 관리:
    PnP는 프로젝트의 루트 디렉토리에 node_modules 디렉토리를 생성하지 않는다. 대신에 프로젝트 루트에 있는 .pnp.js 파일을 통해 의존성을 해결하고 로딩한다.

  2. 효율적인 의존성 해결:
    PnP는 의존성을 미리 해결하고 필요한 모듈을 찾아 로딩한다. 이는 불필요한 중복 설치를 피하고, 필요한 모듈만 로딩하여 메모리를 절약한다.

  3. 향상된 성능:
    PnP를 사용하면 패키지 설치가 더욱 빨라진다. node_modules를 생성하거나 업데이트할 필요가 없기 때문이다.

  4. 캐시 활용:
    PnP는 .pnp/ 디렉토리를 사용하여 패키지를 캐싱하고, 동일한 의존성을 여러 프로젝트에서 공유할 수 있다.

  5. 더 나은 보안:
    PnP는 패키지 해시를 사용하여 의존성의 무결성을 검증하고, 패키지가 변경되지 않았는지 확인한다.

  6. Workspaces 지원:
    PnP는 Workspaces 기능을 지원하여 다중 패키지 프로젝트를 더욱 효과적으로 관리할 수 있다.

따라서 PnP를 통해 Yarn Berry는 의존성 관리의 효율성과 속도를 크게 향상시킬 수 있다. 이는 node_modules를 사용하는 기존 방식보다 더욱 현대적이고 효율적인 패키지 관리 방법이다.

10. 마무리.

우리 회사 역시, 기존에는 yarn-classic으로 node-modules로 관리했다.

하지만, yarn-berrya 도입 이후, node-modules와 같은 패키지의 용량 감소로 인해 빌드 및 배포 속도가 현저히 감소했다. 또한, 종속성 설치 시의 속도가 기존의 node-modules에 비해서 훨씬 빨라졌다.

다만, 우리 프로젝트는 husky의 도입으로 zero-install을 직접적으로 도입할 수는 없었다고 한다.

이처럼, 회사 내부 사정이나 프로젝트마다 각자의 여건이나 조건에 따라 부분도입 혹은 완전 도입이 가능하다. 그래서 사실 어떤 기술이 좋다고 해서 무조건 도입하기보다는 각자 상황에 맞게 적절히 취사선택하는 것이 진짜 덕목이지 않을까 싶다.

아래 링크는 이번에 yarn-berry를 공부하면서 참조한 토스의 블로그다. 많이 참조해서 개념과 어떻게 도입했는 지에 대한 자세한 부분을 익힐 수 있어서 학습에 큰 도움이 되었다.

꼭 한 번 읽어보시면 좋겠다.

참조
토스 yarn-berry 도입기.
https://toss.tech/article/node-modules-and-yarn-berry

profile
개발도 예능처럼 재미지게~

0개의 댓글