Node.js 프로젝트에서 예전부터 사용되던 패키지 관리자는 npm입니다. 하지만 npm 이후 새롭게 생겨난 패키지 관리자는 yarn입니다. 저는 계속해서 npm을 이용해왔기에 아무런 생각없이 항상 패키지 관리자는 npm으로 구성했습니다. 하지만 언제가부터 yarn의 성능이 더 좋다는 블로그 글을 몇 번 보게 되면서 yarn에 대한 궁금증이 생겼습니다. 그래서 오늘은 제가 조사한 yarn에 대한 정보를 공유해보려합니다.
Yarn이란?
yarn은 2016년에 페이스북에서 개발한 Node.js 패키지 관리자 시스템입니다. npm같은 경우 Node.js에 기본적으로 포함되어 있기 때문에 쉽게 사용할 수 있는데요. npm에 몇 가지 단점이 존재했기 때문에 yarn은 이를 보완하기 위해 개발되었다고 합니다.
npm 단점과 이를 해결한 yarn 방식
npm 단점에는 다음과 같은 것들이 있습니다.
1. 패키지 중복 및 버전 불일치
npm을 사용할 때는 node_modules 하위에 패키지들을 설치합니다. 이때 중복된 패키지가 설치될 수 있다는 단점이 존재합니다. 그렇기 때문에 프로젝트가 커지면 이 부분이 큰 문제가 될 수 있습니다. 이를 설명하기 위한 예시는 다음과 같습니다.
node_modules/
├── A/ ← A 패키지가 최상위에 설치됨
└── B/ ← B 패키지
└── node_modules/
└── A/ ← B 패키지 안에도 A 패키지가 다시 설치됨
위와 같이 B 패키지는 A 패키지에 의존성을 가집니다. 이때 A 패키지를 미리 설치했다고 해도, B 패키지를 설치할 때는 미리 설치된 A 패키지를 그대로 이용하는 방식이 아니라 B 패키지 하위에 또 A 패키지를 설치하는 방식으로 패키지들을 관리합니다.
또한 npm은 기본적으로 패키지를 찾지 못하면 상위 디렉토리 폴더로 옮겨가며 탐색을 진행합니다. 이로 인해 node_modules 상태에 따라 탐색된 의존성 패키지 버전이 달라지는 경우가 생깁니다.
2. node_modules 용량
npm을 이용해 여러 패키지를 설치하다보면 node_modules 용량이 너무 커질 수 있습니다. 이렇게 용량이 커지면 단순 용량뿐만 아니라, node_modules 디렉토리 구조를 만들기 위해서 많은 I/O 작업이 필요합니다. 이를 해결하기 위해 yarn 버전 1에서는 node_modules을 그대로 사용하는 대신 '호이스팅'을 사용합니다. 하지만 여기서도 유령 의존성 문제가 발생합니다.
✅ 해결방법
Yarn은 이런 문제를 PnP(Plug'n'Play) 방식으로 해결했습니다.
.yarn/
├── cache/
│ ├── A/ ← A 패키지가 캐시 폴더에 저장됨
│ └── B/ ← B 패키지도 캐시 폴더에 저장됨
└── pnp.cjs ← A와 B의 경로 매핑 정보가 저장된 파일
즉, B패키지가 A패키지에 의존하더라도 실제 패키지는 한 번만 캐시 형태로 저장됩니다. 그럼 B 패키지는 A 패키지를 어떻게 사용할까요? 바로 pnp.cjs 파일을 활용합니다. pnp.cjs에 적힌 경로를 통해 B 패키지는 A 패키지의 위치를 알아내 사용하게 됩니다. 이를 통해 패키지 중복 설치를 해결합니다. 또한 node_modules도 사용하지 않기 때문에 용량문제도 해결됩니다.
참고 자료
node_modules로부터 우리를 구원해 줄 Yarn Berry
토스 프론트엔드 레포지토리 대부분에서 사용하고 있는 패키지 매니저 Yarn Berry. 채택하게 된 배경과 사용하면서 좋았던 점을 공유합니다.
toss.tech
'백엔드' 카테고리의 다른 글
[ELK] Logstash 핵심 요약 및 설정법 (0) | 2025.02.08 |
---|---|
[ELK] Filebeat 핵심 요약 및 설정법 (0) | 2025.02.08 |
Kafka 카프카에 대한 이해와 간단한 실습 (0) | 2024.11.04 |
MSA 구조 구성의 핵심: 메시지 큐(Message Queue)란? - RabbitMQ, Kafka, Redis (0) | 2024.11.04 |
캐싱 전략을 이용한 백엔드 성능 향상 (0) | 2024.11.02 |