티스토리 뷰
개발냥이/자바스크립트(Javascript)
[자바스크립트] 패키지 매니저 정리(npm, yarn, yarn berry, pnpm)
데브캣_DevCat 2023. 6. 13. 21:10패키지 매니저란?
- 프로젝트가 의존하고 있는 라이브러리와 같은 패키지들을 설치하고 관리할 수 있도록 도와주는 프로그램이다.
- 아무리 간단한 프로그램이어도 수십개 이상의 다른 패키지들에 의존하게 되고 이 패키지들은 빈번하게 업데이트 되기 때문에 패키지 매니저를 통해 일괄 관리할 필요가 있다.
패키지 매니저 비교
npm(Node Package Manager)
- Node.js의 표준 패키지 매니저로 Node.js를 설치하면 자동으로 설치된다.
npx(Node Package Runner)
- npm에서 제공해주는 도구
- 프로젝트에 영구적으로 필요한 의존성 패키지나 개발 의존성 패키지들이 아니라, 특정 환경을 구성하거나 특정 작업을 수행하는 시점에만 필요한 패키지들을 설치하고 실행한 후 삭제 과정을 자동으로 진행해주는 도구
Yarn(Yet Another Resource Negotiator)
Yarn classic(Yarn 1)
- npm의 단점을 개선한 패키지 매니저
- yarn은 다운 받은 패키지 데이터를 캐시(cache)에 저장하여 중복된 데이터는 다운로드 하지 않으며 패키지를 병렬적으로 설치하기 때문에 속도가 빠르다.
npm | yarn | |
---|---|---|
설치방식 | 순차적 설치 | 병렬적 설치 |
접근성 | node.js와 함께 자동 설치 | 별도 설치 |
보안 | package-lock.json 파일 자동 생성 및 업데이트 | yarn.lock 파일 자동 생성 및 업데이트 |
로그 | 출력 로그가 방대하다. | 비교적 깔끔하다. |
- npm 출력 로그
yarn 출력 로그
이전에는 npm의 경우 패키지 설치시 자동으로 포함된 의존성 패키지까지 설치하여 보안 문제에 있어서 취약점이 있었으나 현재는 npm도 package-lock.json이라는 잠금 파일을 제공하고 속도면에서도 개선이 많이 되어 눈에 띄는 차이는 없다고 한다.
현재는 yarn classic의 유지보수가 중단되었고 새로운 기능이나 버그 픽스는 yarn berry(yarn 2)에서 이루어진다.
yarn classic의 한계
node_modules 관리의 비효율
- npm과 yarn은 모두 node_modules 폴더에서 모든 의존성을 관리하기 때문에 매우 큰 메모리 공간을 사용하게 되고 이 구조를 만들기 위해 많은 메모리 I/O가 필요하다.
유령 의존성
- 위와 같은 비효율을 줄이기 위해 호이스팅 기법을 사용하는데 이 때문에 직접 의존하고 있지 않은 모듈을 require() 할 수 있는 현상이 나타난다.
Yarn berry(Yarn 2)
- Facebook에서 발표한 yarn의 두 번째 버전이다.
- 유령 의존성에 관한 문제를 해결하기 위해 Plug'n'Play(PnP) 라는 새로운 패키지 관리 방식을 사용한다.
Plug'n'Play(PnP)
- 패키지들에 대한 의존성 정보는 .zip 파일로 압축하여 .yarn/cache 폴더에 저장하고 이를 찾기 위한 정보를 .pnp.cjs 파일에 기록한다.
- pnp.cjs 를 이용함으로써 별도의 디스크 I/O 작업 없이 패키지의 정보와 위치를 파악할 수 있다.
# .pnp.cjs
# react 패키지 중 npm:17.0.1 버전의 위치와 의존성 정보
["react", [
["npm:17.0.1", {
"packageLocation": "./.yarn/cache/react-npm-17.0.1-98658812fc-a76d86ec97.zip/node_modules/react/",
"packageDependencies": [
["loose-envify", "npm:1.4.0"],
["object-assign", "npm:4.1.1"]
],
}]
]],
zero-install
- PnP의 장점으로 무거운 node_modules를 제거함으로써 의존성까지 github에 올릴 수 있게 되었다.
- 이전에는 .gitignore에 node_modules를 포함시키고 package.json에 기록된 것을 각자 로컬에서 다운받는 방식이었다면 zero-install 방식으로 별도의 설치 없이(yarn install 없이) 바로 사용할 수 있다.
- 위와 같은 이유로 브랜치 변경시에도
yarn install
없이 프로젝트를 실행할 수 있고 CI에서도 의존성을 설치할 필요가 없으므로 CI 시간을 크게 절약할 수 있다.
CI(Continuous Integration) : 개발자를 위한 자동화 프로세스로 빌드 및 테스트의 자동화를 의미
pnpm(Performant npm)
- pnpm은 npm을 개선하여 다양한 기능 향상이 이루어진 대체품으로 npm만 있다면 바로 사용할 수 있다.
- 따라서 npm과 사용법이 비슷하지만 불필요한 I/O과정을 없애 빠르고 효율적이며 패키지 중복 설치를 하지 않아서 사용 용량이 적다.
npm과 yarn의 비효율을 개선한 노드 패키지 매니저
- npm과 yarn은 여러 프로젝트에서 같은 의존성을 사용하는 경우 프로젝트 각각의 node_modules 디렉토리에 라이브러리를 모두 설치한다.
- lodash를 사용하는 패키지가 100개 있다고 가정하였을 때 각 폴더별로 lodash 패키지가 100개 복사되는 것이다.
content-addressable strorage
- 반면에 pnpm은 홈 디렉토리의 글로벌 저장소인 ~/.pnpm-store 에 모든 패키지를 저장하는 전역 저장소(Virtual Store)를 두어서 패키지를 공유하는 구조이다.
- 패키지를 설치할 때 package.json에 명시된 패키지를 읽은 후 node_modules에 심링크(Symbolic link)를 생성하여 전역 저장소에 있는 패키지를 참조하는 형식이다.
- 이 방식을 통해 같은 패키지는 단 한 번만 설치하여 효율적으로 패키지를 관리한다.
- 같은 패키지이지만 다른 버전의 라이브러리를 사용하는 경우에는 기존 패키지를 건드리지 않고 다른 버전의 라이브러리만 새롭게 추가하여 버전 호환 문제에서도 자유롭다.
마무리
- npm보다 속도와 보안을 개선해서 yarn이 등장하였지만 요즘에는 npm도 package-lock.json에서 패키지의 무결성을 확인하며 속도면에서도 개선이 이루어졌다.
- yarn-berry를 사용할 경우, 협업에 있어서 각자 네트워크에서 패키지를 다운로드 받는 게 아니라 동일한 파일을 source로 사용하기 때문에 같은 개발 환경을 공유하는 것이 보장이 된다. 그러나 아직 PnP를 지원하지 않는 패키지가 존재하기 때문에 이러한 패키지에 의존하는 순간 node_modules가 따라오게 되어 장점을 누릴 수 없게 된다.
- pnpm은 npm과 사용법이 비슷하고 yarn1/2와 npm의 핵심기능을 모두 지원하며 종속성 관리 측면에서 좀 더 개선되었다는 장점이 있으나 국내 사용량이 적어서 레퍼런스가 적다는 단점도 있다.
- 서비스의 규모가 커져서 모노레포 환경을 구축하는 경우에는 pnpm을 사용하면 디스크 공간을 절약할 수 있으며 peer-dependency를 명시해야 한다는 제약사항 덕분에 더 안정적이라고 한다!
모노레포 : 같은 레포지토리에서 서로 다른 프로젝트들을 관리하는 소프트웨어 개발 전략. 다양한 프로젝트 FE 코드를 한 곳에서 관리함으로써 코드 재사용, 외부 의존성 관리, 리팩토링 측면에서 장점이 있다!
참고 자료
반응형
'개발냥이 > 자바스크립트(Javascript)' 카테고리의 다른 글
[리액트] 렌더링 최적화(React.memo, useMemo, useCallback) 정리 (0) | 2023.08.02 |
---|---|
[자바스크립트] CSS 라이브러리 비교해보기 (0) | 2023.06.16 |
[자바스크립트] 비동기 통신_async/await (0) | 2023.05.02 |
[자바스크립트] 비동기 통신_프로미스(Promise) (0) | 2023.04.25 |
[React] 리덕스(Redux) 이해하기 (0) | 2023.04.24 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 이분탐색
- 백준
- Comparator
- BFS
- 자바dp
- DP
- 자바스크립트
- SQL
- 타입스크립트
- Spring
- Nest
- SQLD
- Algorithm
- 자바bfs
- 스프링부트
- JPA
- dfs
- 해시맵
- CS
- java
- 형변환
- 자바
- 자바트리
- 스프링
- 프로그래머스
- 알고리즘
- 리액트
- 정렬
- Queue
- JavaScript
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함