한번 쯤 velog에서 Yarn Berry에 관한 글을 읽어보거나 봤을 것이다.
그럼 대체 Yarn Berry가 뭘까 싶은데 yarn은 알겠다만 Berry는 처음 보는 사람들이 있을 것이다.
Berry란?
yarn2의 프로젝트 명이 berrry라고 한다.
Github repository에 들어가보면 berry 레포이다 ㅋㅋ
그럼 설명에 들어가기 앞서 node_modules의 문제점에 대해 설명하겠다.
보통 npx create-react-app project
나 yarn create react-app project
로 하면 node_modules 폴더가 있다는 것을 알 것이다. node_modules에는 우리가 사용하는 여러 패키지들에 대한 정보를 모아놓은 폴더이다. 아래 사진을 보면 node_modules에 관한 유명한 사진이 있다.
라이브러리가 많이 설치될 수록 node_modules의 depth는 점점 깊어지고 무거워진다는 것을 표현한 사진이다.
넘어가, node_modules는 대표적으로 2가지의 문제점이 있다.
만약 리액트 프로그램에서 특정 라이브러리를 가져올 때 NPM은 패키지를 찾기 위해서 상위 디렉토리의 node_modules 폴더를 계속 탐색한다. 만약 패키지를 찾지 못하면 또 상위 디렉토리를 검색하기에 느린 I/O속도를 자랑한다. 그리고 검색에 실패하는 경우도 있다고 한다.
사진으로 예시를 들어보겠다.
출처 - https://jihyundev.tistory.com/24
react 패키지를 탐색할려고하면 매 탐색마다 많은 폴더와 파일을 열고 닫으며 검색을 수행한다. 이 과정에서 직접 I/O로 처리하다 보니 최적화가 어려워지고 경로도 복잡해진다.
더 나아가, 패키지를 찾지 못하면 상위 폴더로 이동하여 찾기 때문에 여기서 또 여러 단점을 야기하게 된다. 그 중 2가지를 언급하자면 오래걸리는 install 속도와 패키지 중복제거를 못하는 문제가 있다.
공식문서에 따르면 yarn install
로 install하면은 설치과정에서 70%를 node_modules가 차지한다고 한다. 또한, 이미 설치된 패키지가 node_modules에 포함되어있는지 상위로 올라가 비교해야했다. 이로인해 속도 저하가 일어난다.
node_modules 패키지 관리자가 중복제거를 할 수 없도록 폴더가 디자인 되어 있다. 특정 노드트리는 호이스팅을 통해 최적화 할 수 있지만, 설계상 그렇게 할 수 없는 트리도 있었다. 이로인해 디스크 사용량이 필요 이상으로 높아진다.
npm과 yarn v1은 node_modules 내부의 중복된 패키지를 최소화하기 위해 각 패키지가 의존하고 있는 하위 패키지들을 호이스팅한다. 그로인해 자신이 직접 설치하지 않고, 간접으로 설치한 종속성을 개발자가 접근하여 사용할 수 있게된다. 한마디로 package.json에 명시되지 않은 라이브러리를 사용할 수가 있는 것이다. 그러면 예상치 못한 동작이나 충돌을 일으킬 수 있다. => 유령의존성이라고 한다.
Yarn Berry는 Node.js를 위한 새로운 패키지 관리 시스템으로, 기존의 npm, yarn v1의 패키지 비효율적인 매니징 방법을 개선하며 빌드 시간을 단축시켜주고 개발 과정에서의 안정성을 높여준다.
yarn berry는 Plug'n'Play 전략을 내세웠다.
Plug'n'Play는 yarn berry가 제공하는 새로운 패키지 관리 시스템이다.
기존의 무거웠던 node_modules 대신, 패키지들에 대한 정보는 .zip 파일로 압축하여 .yarn/cache 폴더에 저장하고 이를 찾기 위한 정보를 .pnp.cjs 파일에 생성 후 의존성 트리 정보를 단일 파일에 저장한다. 이를 인터페이스 링커 (Interface Linker)라고 한다.
이로 인해 node_modules를 사용하지 않기에 더 이상 패키지들을 호이스팅하지 않는다. 그래서 package.json에 명시된 라이브러리들에만 접근이 가능해지므로써, 유령의존성을 근본적으로 해결되었다.
github는 파일당 최대 용량을 500MB으로 제한하고, 원활한 이용을 위해 저장소당 1GB 미만의 크기를 유지 하는 것을 권장한다.
yarn berry를 통해 만든 의존성 폴더는 거의 200MB를 넘지 않기에 PnP 전략으로 무거운 node_modules를 제거하고 yarn으로 옮김으로써 github에 올릴 수 있게 되었다.
그래서 해당 레포를 git clone하고 사용한다고 하면 별도의 설치가 없이 바로 사용이 가능해진다. 그렇기에 설치하는게 하나도 없기에 zero install이라고 부른다!
이렇게 node_modules의 단점을 통해 yarn berry의 도입배경과 PnP, Zero install에 대해 글을 적어봤는데 도움이 됐으면 좋겠다. yarn berry를 쓴다고하면 규모가 큰 프로젝트에 적용하면 매우 큰 이점을 얻을 수 있을 것 같다.