node.js 패키지매니저 npm과 yarn 비교
Node.js 패키지 매니저 도구 npm 과 yarn
Yarn은 기존의 npm이 가지고 있던 문제점들을 해결하기 위해 등장했다.
npm 에는 어떤 문제점들이 있을까?
- 일괄적이지 않은 패키지 버전
- 고정되지 않은 설치 순서
- 순차적인 설치로 인한 긴 소요 시간
일괄적이지 않은 패키지 버전
npm install 명령어를 통해 모듈들을 설치하면 해당 메이저 버전 중 최신 버전을 다운받게 된다.
빌드에 따라 유연하게 버전을 선택할 수 있지만 사용하는 모듈간의 버전 불일치로 인해 문제가 발생할 수 있다.
서로 다른 환경에서 하나의 프로젝트를 개발하는 것은 잠재적인 위험 요소가 있다는 것과 같다.
고정되지 않은 설치 순서
개발자의 환경에 따라 모듈들의 설치 순서가 바뀔 수 있다. 이미 만들어진 프로젝트에서 모듈을 추가로 설치하는 경우
뒤에 npm i 명령어를 통해 처음부터 설치하는 사람과 모율 설치 순서가 달라질 수 있다.
내가 어떤 순서로 모듈을 의존성에 추가했는지에 상관없이,
npm은 모듈 이름을 사전 순서대로 정렬하여 순차적으로 설치하기 때문.
이런 상황 역시 서로 다른 환경이 만들어지기 때문에 잠재적 위험 요소를 안고 가는 것과 같다.
순차적인 설치로 인한 긴 소요시간
npm은 모듈들을 한 번에 하나씩만 순차적으로 설치한다. 설치해야 하는 모듈이 많을 수록 총 설치 시간이 길어지게 된다.
첫 모듈 설치 시간이 길어지면 빌드 및 배포 시간에도 부정적인 영향을 끼치게 된다.
그렇다면 yarn은 npm의 어떤 점을 해결하였을까?
yarn의 주요기능
일관된 패키지 버전 설치
yarn.lock 을 사용하여 정확한 버전을 지정하고 고정한다.
yarn은 사용할 모듈의 버전을 지정하기 위해 프로젝트에 .lock 파일이 자동으로 생성된다.
정확한 버전을 지정하고 고정하기 때문에,
다른 사용자가 프로젝트를 개발할 때 항상 같은 버전의 모듈을 사용할 수 있도록 보장한다.
yarn.lock 파일 덕분에 기존 npm의 일관적이지 않은 패키지 버전 문제를 해결할 수 있다.
npm 메인테이너들도 기존 문제를 인지하고 있었고 해결 방안으로 npm shrinkwrap 명령어를 사용해서
패키지들의 버전을 포함한 npm-shrinkwrap.json 파일을 생성해준다. 이 파일이 프로젝트에 함께 있을
경우, package.json에 명시된 버전을 무시하고 json 파일에 적힌 버전을 설치한다.
하지만 수동적으로 매번 명령어를 입력해서 json 파일을 생성하는 과정이 필요해 불편한 점이 있다.
checksum 사용
yarn은 패키지가 제대로 설치되었는지 확인하기 위해 checjsum을 사용한다.
yarn.lock 파일을 확인해보면 .resolved 주소 뒤에 해시값이 추가 되어있는 것을 확인할 수 있다.
이 해시값이 checksum이다.
제대로 설치되지 않은 경우를 대비해 패키지 파일의 무결성을 확인하는 안전장치가 추가되었다고 볼 수 있다.
속도
yarn의 장점에서 빠질 수 없는 요소는 역시 속도이다. yarn은 캐시를 이용하여 한번 다운로드한 패키지의 경우
그 다음부터는 빠른 속도로 설치가 가능하다. 심지어 인터넷이 연결되지 않은 환경에서도 설치가 가능하다.
또한 병렬 다운로드를 지원하여 순차적으로 설치해야하는 npm과 달리 모듈들을 한꺼번에 설치해버린다.
yarn이 npm 보다 설치 속도가 상대적으로 빠른 이유 중 하나이다.
두 패키지 매니저 프로그램에 남아있는 문제점들
유령 의존성
npm의 node_modules 폴더는 큰 용량으로 유명하다. 수 많은 패키지들과 그 패키지가 의존하는 모듈들을 전부
설치해버린다면 무거워질 수 밖에 없다.
npm은 이 무거운 폴더를 경량화시키기 위해 호이스팅을 도입하고 있다.
npm과 yarn은 node_modules에 있는 중복된 패키지가 최상단에 하나만 존재하게 되어 불필요한
중복을 제거할 수 있게 된다.
하지만 이렇게 되면 내가 설치한 패키지가 의존하고 있다는 이유로 다른 패키지까지 슬쩍 불러올 수 있게 된다.
나는 설치한 적이 없지만, 그 패키지는 최상단에 유령처럼 존재하고 있다. 이것을 유령 의존성이라고 부른다.
yarn berry
yarn berry는 yarn v2 이상의 modern version yarn을 이르는 명칭이다.
기존의 yarn v1은 yarn classic이라고 부른다.
Plug'n'Play
yarn berry가 제공하는 새로운 패키지 관리 시스템이다.
기존의 무거웠던 node_modules 대신, 패키지들에 대한 정보는 .zip 파일로 압축하여 .yarn/cache 폴더에
저장하고 이를 찾기 위한 정보를 .pnp.cjs 파일에 기록한다.
별도의 I/O 작업 없이도 패키지의 위치를 정확하게 알 수 있기 때문에 시간이 단축되고, 중복 설치를 방지한다.
node_modules를 만들고 패키지들을 호이스팅 시킬 필요가 없는 Plug'n'Play의 특성 덕분에
유령 의존성 문제도 해결할 수 있다. 패키지를 압축한 덕분에 용량은 더욱 줄어들었다.
Zero install
Plug'n'Play 방법으로 무거웠던 node_modules를 획기적으로 제거하고 옮긴 덕분에 이를 이용해 의존성까지 github에
올릴 수 있게 되었다.
github는 파일 당 최대 용량을 500mb로 제한하고, 원활한 이용을 위해 저장소 당 1gb 미만의 크기를 유지할 것을
권장하고 있다.
yarn berry를 통해 만든 의존성 폴더는 어지간히 크지 않은 이상 200mb를 넘지 않는다.
덕분에 git clone 이후 별도의 설치가 필요 없이, 바로 사용할 수 있도록 하는 zero-install을 시도해볼 수 있다.
zero-install을 사용할 경우 로컬에서의 귀찮음도 줄어들지만, CI/CD 파이프 라인을 구축한 경우
곧바로 빌드가 가능해진 덕분에 배포까지 걸리는 속도가 단축된다.