본문 바로가기
프론트엔드/개발 기초 지식

[패키지 매니저] Yarn Berry

by 학습하는 청년 2024. 12. 20.

최종 수정 : 24.12.20

Yarn Berry

Yarn의 2.0 버전을 의미하며, 기존 Yarn(Yarn 1.x, Classic)의 한계를 극복하기 위해 재작성된 새로운 패키지 매니저

 

Yarn Berry의 문제점

1. node_modules가 차지하는 용량이 매우 크다.

여러 프로젝트에서 같은 패키지를 사용해도 각각의 node_modules에 별도로 설치된다. 이에 따라, 그만큼 용량을 차지하게 된다. 만약, 여러 프로젝트를 동시에 진행중이라면, 그만큼 많은 용량을 차지하게 된다.

 

☞ Plug'n'Play(PnP) 시스템은 node_modules 폴더 대신 의존성을 .zip 파일로 저장한다. 예를 들어, React, lodash 등의 패키지들이 각각 압축된 형태로 저장되어 전체 프로젝트 크기를 대폭 줄일 수 있다. 또한, 여러 프로젝트에서 동일한 .zip 파일을 참조할 수 있어 중복 설치 문제도 해결된다.

 

2. 의존성 설치 시간이 느리다.

매 프로젝트마다 패키지를 새로 다운로드 하고 압축을 해제 해야 한다. 또한, CI/CD 환경에서는 캐시가 없어 매번 처음부터 설치를 진행해야 한다.

 

☞ 의존성을 압축 파일로 관리하여 설치 시간을 대폭 단축된다. 기존에 2-3분 걸리던 과정이 몇 초 내로 완료될 수 있다. 특히 CI/CD 환경에서 큰 효과를 볼 수 있는데, 압축 파일을 그대로 가져다 쓸 수 있어 매번 패키지를 새로 다운로드하고 설치할 필요가 없다.

 

3. 유령 의존성(phantom dependencies) 문제

실제로는 package.json에 명시되지 않은 패키지를 사용할 수 있다. 예를 들어 react-redux가 react-router를 의존성으로 가지고 있다면, 프로젝트에서 react-router를 설치하지 않아도 import해서 사용할 수 있다. 이는 나중에 react-redux 버전을 업데이트하면서 react-router가 제거되면 에러를 발생시킬 수 있다.

 

☞ 엄격한 의존성 관리로 PnP 시스템은 package.json에 명시된 의존성만 정확히 사용할 수 있도록 강제한다. 이를 통해, 의존성 관계가 명확해지고, 예상치 못한 패키지 제거로 인한 문제를 사전에 방지할 수 있다.

 

4. 비효율적인 캐싱 시스템

캐시가 있더라도 매번 파일을 복사하는 과정이 필요하고, 환경이 달라지면 캐시가 무효화되어 다시 패키지를 다운로드 해야 한다. 특히 Docker 컨테이너를 사용하는 환경에서는 레이어 캐시가 쉽게 꺠져서 빌드 시간이 늘어나는 원인이 되기도 한다.

 

☞ Zero-Installs 개념 도입으로 의존성을 Git에 직접 포함시킬 수 있다. 이는 마치 Java의 Maven이나 Gradle처럼 작동하며, 새로운 개발자가 프로젝트를 클론받았을 때 별도의 설치 과정 없이 바로 개발을 시작할 수 있다. 또한, CI/CD 환경에서도 패키지 설치 단계를 건너뛸 수 있다.

 

5. 느린 Hoisting 방식

패키지의 중복을 줄이기 위해 의존성을 최상위로 끌어올리는 호이스팅 방식을 사용하는데, 이 과정이 복잡하고 예측하기 어렵다. 같은 패키지의 서로 다른 버전이 필요한 경우, 어떤 버전이 호이스팅될지 예측하기 어려워 버전 충돌 문제가 발생할 수 있다.

 

☞ PnP를 통해 모든 패키지를 동일한 레벨에서 관리하는 평면적인(flat) 구조를 사용한다. 이를 통해 호이스팅으로 인한 복잡성과 예측 불가능성을 제거한다. 각 패키지는 자신의 정확한 의존성을 명시적으로 참조하게 되어 버전 출돌 문제가 크게 줄어든다.

 

6. 일관성 없는 패키지 해석

같은 package.json 파일을 사용하더라도, 패키지 설치 순서나 환경에 따라 다른 의존성 트리가 만들어질 수 있다. 이로 인해, "내 컴퓨터에서는 되는데..." 같은 상황이 벌어지며, 개발자들 사이에서 일관성 없는 동작을 유발할 수도 있다.

 

☞ .pnp.cjs 파일을 통해 모든 의존성의 위치와 버전을 명확하게 관리한다. 이 파일을 마치 지도처럼 작동하여 어떤 환경에서도 동일한 방식으로 패키지를 찾고 로드할 수 있게 만들어 "내 컴퓨터에서는 되는데..." 같은 상황을 효과적으로 해결할 수 있다.

 

7. 부정확한 버전 잠금

yarn.lock 파일이 있음에도 불구하고, 특히 peer dependencies나 선택적 의존성의 경우 정확한 버전 잠금이 이루어지지 않는다. 이로 인해 개발자마다 다른 버전의 패키지가 설치될 수 있으며, 이는 예상치 못한 버그나 호환성 문제를 야기할 수 있다.

 

☞ yarn.lock 파일의 개선된 버전 관리 시스템을 통해 더욱 정확한 의존성 버전을 보장한다. peer dependencies나 선택적 의존성까지 포함하여 모든 패키지의 버전을 정확하게 고정할 수 있다. 이를 통해 모든 개발자가 정확히 동일한 버전의 패키지를 사용할 수 있게 된다.

댓글