카테고리 없음
pnpm에 대해
J-Ymini
2025. 5. 17. 14:04
pnpm에 대해
pnpm(performant npm)
은 npm의 의존성을 더 효율적으로 관리하기 위해 만들어졌다. 실제로 내부적으로 어떻게 동작해서 기존보다 더 나은 환경을 제공하는지 살펴보자.
기존 npm에서 발생하는 이슈
디스크 공간 낭비
- npm 사용시, 사용하는 프로젝트마다 모두 의존성을 개별적으로 갖고 있으므로 중복되는 의존성으로 인해 디스크 공간의 낭비가 있다.
패키지 호이스팅의 부작용
- npm은 의존성 중복, 의존성 충돌등의 이슈를 해결하기 위해 패키지의 호이스팅으로 중복된 패키지들을 관리하기 위한 평탄화가 이루어진다. (npm 3버전 부터 적용) 하지만 이 과정에서 가장 가까운
node_modules
부터 모듈을 로드하는 Node.js 규칙 때문에, 의도치 않게 설치한 패키지가 선택되어 의도되지 않은 동작을 할 경우가 생긴다. (설치하지 않은 의존성이 암묵적으로 사용이 가능해지는 유령 의존성 이슈)
만일 pnpm
을 도입을 하게 되면 어떤점들이 나아질까?
pnpm을 통해서 얻는 이점
패키지 중앙저장 통한 디스크 공간 절약
Content addressable store
컨셉을 기조로 모든 패키지는 디스크상의 단일 위치에 저장이 되며, 하드링크로 인해 같은 버전의 의존성을 추가고자 할 경우 디스크의 추가 공간을 소비하지 않게된다.(다른 버전은 설치 진행)
하드 링크 & 심볼릭 링크
하드 링크(Hard Link)
- 파일 시스템에서 동일한 파일의 내용을 가리키는 또 다른 파일명
- 파일의 실제 데이터를 가리키는 직접적인 참조
- 원본 파일과 하드링크는 동일한 inode를 공유
- 원본 파일이 삭제되어도 하드링크를 통해 데이터에 접근 가능
- 디렉토리에 생성 불가
심볼릭 링크(Symbolic Link)
- 다른 파일이나 디렉토리의 경로를 가리키는 특별한 파일(일종의 바로가기)
- 원본 파일의 경로를 저장하는 간접적인 참조
- 원본과 다른 inode를 가짐(inode: 파일 시스템에서 파일이나 디렉토리의 메타데이터를 저장하는 데이터 구조, 파일시스템 내에서 고유한 값을 가지고 있음)
- 원본 파일이 삭제되면 심볼릭링크는 깨짐(dangling link)
- 디렉토리에도 생성 가능
pnpm
을 통해서 의존성을 설치하게 되면 프로젝트의node_modules
에는 실제 파일 대신 심볼릭 링크(경로 정보만 저장)가 생성된다. 정확히는 스토어제 실제로 저장된 패키지와 하드 링크된.pnpm
내부로 심볼릭 링크가 지정된다.
의존성 트리 보존
- pnpm은 강제 평탄화를 하지 않고, 패키지별 실제 트리 구조를 유지한다. 따라서 패키지의 호이스팅이 일어나지 않으므로 의도하지 않은 패키지 사용 문제인 유령 의존성 이슈를 방지할 수 있다.