-
[JS] JavaScript Package Manager에 대해 알아보자!!카테고리 없음 2023. 6. 18. 16:20728x90
Package Manager?
패키지 매니저는 소프트웨어 개발 과정에서 프로젝트에 필요한 라이브러리, 프레임워크를 설치하고 관리한다. 패키지 매니저를 통하여 종속성을 관리하고 프로젝트에 필요한 패키지를 쉽게 가져올 수 있으며 패키지의 버전 관리, 의존성 해결 등을 자동으로 처리할 수 있다. 주로 패키지 매니저는 명령행 인터페이스를 통하여 패키지를 설치, 업데이트, 제거하는 작업을 수행한다. 패키지 매니저를 사용하면 개발 프로세스를 간편화하고 체계적인 의존성 관리로 효율적인 소프트웨어 개발이 가능하다.
Package Manager의 종류!
패키지 매니저의 종류는 다양하다. 각 언어별로 패키지 매니저가 존재하고, 한 언어 내에서도 다양한 패키지 매니저가 존재한다.
각 언어의 패키지 매니저를 간단하게 알아보자면,,
- Python - 표준이 되는 패키지 매니저인 pip
- Ruby - RubyGems
- Java - XML 기반의 프로젝트 구성 파일을 사용하는 Maven
- Java - Java 및 Android 프로젝트를 위한 빌드 자동화 도구이자 패키지 매니저인 Gradle
- Go - Go 1.11 버전부터 표준으로 내장되된 Go Modules
이 외에도 다양한 언어에는 해당 언어의 생태계에 특화된 패키지 매니저가 있다.
JavaScript Package Manager
npm (Node Package Manager)
npm은 세계 최대의 소프트웨어 패키지 매니저이다. JavaScript 패키지 생태계의 중심지가 되며, 수백만 개의 패키지를 보유하고 있다. JavaScript 개발자들은 npm을 통해 다양한 용도로 사용할 수 있는 라이브러리, 프레임워크 등의 풍부한 선택지를 가질 수 있다.
npm은 Node.js와 함께 함께 설치된다.
npm의 장점
- 광범위한 사용자 베이스를 가지고있어 엄청난 규모의 네트워크가 형성되었다.
- 매년 새로운 패키지들이 출시되고 사용자 수도 지속적으로 증가하고 있다. 커뮤니티 기반의 개발과 협업을 촉진하며, 개발자들이 패키지를 공유하고 사용자 피드백을 받는 등의 환경이 구성되어 있다.
- 글로벌 설치와 로컬 설치가 가능하여 프로젝트별로 패키지를 분리하여 관리할 수 있다.
- package.json 파일을 통해 종속성을 정의하고 이를 기반으로 필요한 패키지를 설치하여 간편하게 작업을 수행할 수 있다.
npm의 단점
left-pad 사건
수많은 프로젝트들이 의존하고 있던 패키지가 비공개로 전환되자 해당 프로젝트들은 마비되었다. 프로젝트들의 빌드가 실패하고, 의존성 체인이 깨지는 상황이 벌어졌다. left-pad 사건은 npm 생태계의 취약성과 의존성 관리의 중요성을 일깨워줬다. 이 사건을 계기로 많은 개발자들은 의존하는 패키지를 신중하게 선택하게 되었고, npm에서 일어날 수 있는 잠재적 위험에 대비하게 되었다.
- npm은 엄청난 수의 패키지를 호스팅 하고 있기 때문에 보안 취약성이 발견되는 경우가 있을 수 있다. 악성 코드가 패키지에 실어져 있을 수도 있으며, 개발자들은 신뢰할 수 있는 소스에서 패키지를 가져와야 한다.
- 다양한 패키지 보유로 인한 저장소의 크기가 커지고, 패키지 검색 속도가 느려지는 등의 문제가 생길 수 있다. 또한 npm이 설치된 프로젝트의 node_modules 디렉토리에는 많은 파일과 디렉토리가 포함되어, 디스크 공간과 빌드 성능에 영향을 줄 수 있다.
yarn
yarn은 페이스북에서 npm의 단점과 성능을 보완하여 만들어진 패키지 매니저이다. npm의 경우, 필수적인 단계를 순차적으로 수행하여 속도가 아쉽지만, yarn은 동시에 여러 패키지들을 설치할 수 있기 때문에 속도 면에서 성능이 향상된다고 한다. 하지만 최신 버전의 yarn과 npm은 속도의 차이가 거의 없으며 yarn이 근소하게 앞선다고 한다.
yarn의 장점
- yarn은 yarn.lock 파일이나 package.json에 있는 것들만 설치하여 디바이스마다 다른 버전이 설치되어 발생할 수 있는 문제들을 해결하였다. 이 부분은 계속 강화되고 있다.
- 패키지 설치 시에 각 패키지에 고유한 해시값을 할당하여 정확한 패키지 버전과 의존성을 보장한다.
- 직관적이고 사용하기 편리한 명령어를 제공한다. 또한 진행상황 바와 상세한 로그 메시지를 표시하여 설치 과정을 보다 시각적으로 보여준다.
yarn의 단점
- npm에 비해 메모리 용량을 많이 사용한다. 이는 제한된 메모리 환경에서 작업을 수행하는 개발자들에게 문제가 될 수 있다.
- yarn은 초기 설정과 프로젝트 구성의 복잡성이 조금 높을 수 있다. 특히 처음 사용하는 개발자들은 약간의 학습 곡선을 겪을 수 있다고 한다. 하지만 이 문제는 잘 체감되지 않았다.
yarn berry
yarn berry는 yarn v1의 주요 개발자인 Nison 씨가 개발하였다. npm은 범용적으로 사용되고 있으나 비효율적이거나 깨져있는 부분이 많다. node_modules 디렉토리를 이용하여 관리한다면 의존성 검색은 비효율적으로 동작한다. 오랜 설치 시간이 걸리며, 정합성을 보장할 수 없다. 또한 명시하지 않은 의존성이 설치될 수 있다. 상위 폴더의 node_modules까지 순회하며 의존성을 찾기 때문에 자칫하면 하위 패키지까지 깨뜨릴 수 있다.
yarn PnP
Yarn PnP는 Yarn v2에서 소개된 기능으로, 기존의 node_modules 디렉토리 구조를 변경한다. 모든 종속성이 하나의 파일에 기록되며 필요한 패키지를 필요할 때마다 필요한 폴더에 복사하는 방식으로 동작된다. node_modules 디렉토리의 용량과 디스크 접근 속도를 줄일 수 있다. 또한 전체 프로젝트의 종속성을 관리하므로, 프로젝트 디렉토리 내에서 특정 패키지의 버전을 변경하거나 추가, 제거할 수 있다.
toss에서는 pnpm 사용 시 42초가 소요되던 설치 시간이 yarn PnP 도입 시 6초로 단축되었다 한다.
yarn berry의 장점
- yarn PnP를 기본으로 사용하여 빠른 설치 속도와 엄격한 의존성 관리가 가능하다.
- 의존성을 압축 파일로 관리하여 의존성의 용량이 적다. 의존성을 구성하는 파일의 수가 많지 않다. 때문에 의존성을 버전 관리에 포함하여 Zero-Install을 구현할 수 있다.
- yarn berry의 기능이 부족하다면 손쉽게 플러그인을 제작할 수 있다.
yarn berry의 단점
- 가끔 모노레포 내의 패키지들에 얽힌 의존성을 잘못 참조하여 알 수 없는 문제를 일으킨다고 한다.
- 기존 Node.js 생태계와의 호환성 문제를 야기할 수 있다. 일부 도구나 라이브러리는 node_modules 디렉토리 사용을 가정하고 동작한다.
pnpm
pnpm은 공유 패키지 설치와 작은 디스크 공간 요구를 통해 빠른 설치 및 효율적인 패키지 관리를 제공한다. 현재 우리 팀에서도 채택하고 있는 패키지 매니저이다. pnpm은 node_modules를 global on-disk content-addressable store에 hard linking과 symbolic linking방식으로 연결하여 관리한다고 하는데 이러한 방식이 정확히 어떤 건지는 모르겠으나 적은 디스크 공간을 사용하면서 node_modules를 깔끔하게 관리해준다고 한다.
pnpm의 장점
- package.json에 명시되지 않는 모듈의 사용을 차단하여 예기치 못한 버그를 피하는 것을 도와준다.
- 의존성을 삭제하여 분리된 상태로 남겨두지 않는 한, 프로젝트에 관련 없는 패키지는 존재할 수 없다.
- 병렬 설치와 캐시를 활용하여 빠른 패키지 설치 속도를 제공한다.
- 상세한 로그 메시지를 제공하여 설치 과정을 잘 이해할 수 있도록 한다.
pnpm의 단점
- pnpm은 npm이나 yarn과 비교했을 때 비교적 작은 규모의 생태계를 보유하고 있다. 일부 특정한 플러그인이나 도구가 pnpm과 완벽하게 호환되거나 지원되지 않을 수 있다.
- pnpm은 npm 레지스트리와의 호환성을 유지하기 위해 일부 제약 사항을 가지고 있다. 때문에 일부 npm에서 지원하는 기능이나 옵션을 사용할 수 없는 경우가 생길 수 있다.
마치며
위에서 설명하였듯 여러 패키지 매니저들은 각각의 장점과 단점을 가지고 있다. 어떤 패키지 매니저가 최고이니 꼭 써야 하고 어떤 패키지 매니저가 최악이니 절대 쓰면 안 된다라고는 할 수 없다. 각자 처해진 상황이나 환경이 다르기 때문이다. 팀 내에서의 일관성과 협업, 편의성과 사용성, 생태계와 지원, 프로젝트 요구사항 등을 고려하여 최적의 패키지 매니저를 선택할 수 있을 것이다. 현재 우리 팀은 설치, 실행 속도 측면이나 디스크 용량 측면에서 유리한 pnpm을 채택하였다. 학습하는데 별다른 리소스가 들지 않아 금방 사용할 수 있었고 나는 현재 만족하며 사용하고 있다.
References
pnpm vs npm | pnpm
npm의 flat tree
pnpm.io
node_modules로부터 우리를 구원해 줄 Yarn Berry
토스 프론트엔드 레포지토리 대부분에서 사용하고 있는 패키지 매니저 Yarn Berry. 채택하게 된 배경과 사용하면서 좋았던 점을 공유합니다.
toss.tech
728x90