back-end/🐾 삼냥이즈 기술노트

pnpm

삼냥이즈 기술 블로그 2026. 4. 2. 19:57

그동안 리티의 백엔드 서버는 패키지 매니저로 npm을 사용하고 있었다. pnpm이 npm보다 좋다는 말은 여러번 들어서 알고 있었고, 과거에 한번 pnpm으로 패키지 매니저를 바꾸려고 했다가 무언가 꼬여서 그냥 npm을 한동안 계속 사용하였다. 그러던 중 이번 소프트런치 전에 pnpm으로 이전하는것이 좋겠다는 판단이 들어 pnpm에 대해 조사해보았다.

 

https://pnpm.io/ko/motivation

 

동기 | pnpm

Saving disk space

pnpm.io

 

pnpm의 장점

pnpm의 공식 문서에 pnpm을 만든 이유가 잘 설명되어 있다. 공식문서가 굉장히 간결하게 정리되어 있어 놀랐다.

 

[1] 메모리 절약

npm은 패키지를 설치할 때 각 프로젝트의 node_modules 폴더 안에 실제 파일을 그대로 복사한다. 그동안 npm만 사용했던 나는 이게 당연하다고 생각했다.

 

pnpm의 개발 동기는 바로 이런 상황에 문제를 느껴서이다. 만일 프로젝트 100개에서 같은 패키지를 의존한다면 각 프로젝트의 node_modules 폴더에 해당 패키지를 설치해줘야 한다.

 

pnpm은 패키지를 프로젝트마다 저장하지 않고, content-addressable store이라 불리는 전역 저장소에 한번만 저장한다. 그리고, 각 프로젝트에서 이를 사용하려 한다면 전역 저장소와 링크로 연결을 시켜준다. 이런 방식을 사용하면 패키지는 한 번만 저장하면 되어 디스크 사용량을 줄일 수 있다.

 

처음에는 이 구조를 잘못 이해해서, 여러 프로젝트를 동시에 관리하는 모노레포 환경에서만 의미가 있다고 생각했다.

하지만 여기서 말하는 전역 저장소는 레포지토리 단위가 아니라 개발자가 사용하는 컴퓨터 전체 기준의 전역 저장소이다.

즉, 이전에 아예 다른 프로젝트에서 사용했던 패키지와 동일한 버전을 다시 설치하려고 할 때, pnpm은 이미 전역 저장소에 존재하는 패키지를 재사용한다.

 

[2] 속도 개선

속도 개선도 메모리 절약과 동일하게 전역 저장소를 사용하기 때문에 얻는 이점이라 볼 수 있다. 기존엔 새로 패키지를 설치할 때 해당 패키지를 복사해서 node_modules에 붙여 넣어야 했다. 하지만 pnpm을 이용하면 처음 한 번만 전역 저장소에 저장을 하고, 그 이후론 링크만 연결해주면 되므로 패키지 설치 속도가 훨씬 빨라진다

 

[3] 엄격한 의존성 관리

pnpm의 문서를 읽어보면서 npm(yarn도 마찬가지라고 한다) 방식의 문제점을 알게 되었다. npm의 특정한 상황에선 내가 직접 설치하지 않은 패키지를 사용할 수 있다.

 

이건 npm이 의존성에 호이스팅을 적용하기 때문이다.

만일 개발자가 필요한 패키지가 있어 설치한다면 개발중인 프로젝트는 해당 패키지에 의존성을 가지게 된다. 그런데 설치한 패키지 역시 다른 패키지에 의존성을 가지고 있을 수 있다. 이것이 심화된다면 의존성 트리는 매우 깊어지고, 필요한 서로 다른 패키지가 내부적으로 같은 패키지를 의존하는 경우 이 패키지가 중복 설치되는 문제가 발생한다. npm은 이런 문제를 방지하기 위해 트리 구조를 없애고, 모든 내부적으로 의존하는 패키지들을 node_modules 최상위로 끌어 올리는 호이스팅을 수행한다.

 

즉 이 과정을 거치면 개발자가 직접 설치한 패키지와, 그 패키지가 의존하는 다른 패키지가 구분이 되지 않는다.

따라서 개발자가 설치하지 않은 패키지를 사용하더라도 우연히 그 패키지가 의존성 트리 안에 포함이 되어 있다면 직접 설치하지 않은 패키지임에도 문제 없이 사용되는 경우가 발생한다.

 

더 큰 문제는 이게 시한폭탄처럼 작용할 수도 있다는 점이다. 가령 내가 직접 설치한 패키지가 더 이상 다른 패키지를 의존하지 않게 되었는데, 내가 실수로 더 이상 의존하지 않게 된 패키지를 직접 설치하지 않고 그냥 사용하고 있었다면 나중에야 문제가 발생할 수 잇다.

 

pnpm에서는 의존성 트리를 그대로 유지한다. 이 트리 구조를 유지함으로써 개발자가 직접 설치하지 않은 패키지는 코드에서 사용할 수 없고, 해당 패키지에 의존성을 가진 패키지에서만 사용 가능하다. 패키지의 접근 범위를 제한하는 것이다.

 

npm에서 이런 방식을 사용하지 못했던 이유

당시 트리 구조를 그대로 사용할 경우 앞서 말한 경우 중복 설치 문제가 발생한다.

pnpm의 경우엔 전역 저장소에 한 번만 저장하고 링크로 연결하는 방식이라 중복 설치에서 자유롭지만, npm이 만들어질 당시엔 이런 링크 활용이 어려웠다고 한다.

또한 당시 윈도우는 호환이 잘 안되어 깊이가 깊어지자 경로 길이 제한을 초과해 문제가 발생하는 경우도 많았다고 한다.