자바스크립트 패키지 매니저: npm vs. Yarn
이번 포스팅에서는 자바스크립트에서 패키지 매니저로 가장 많이 사용되고 있는 npm과 Yarn에 대해서 알아보겠습니다.
자바스크립트 패키지 매니저
패키지 매니저(package manager)는 프로젝트가 의존하고 있는 패키지를 효과적으로 설치, 갱신, 삭제할 수 있도록 도와주는 관리 도구입니다. 그 어떤 프로그래밍 언어보다 풍부한 오픈 소스 생태계를 자랑하는 자바스크립트에서 특히 패키지 매니저는 중요한 역할을 하는데요. 아무리 간단한 자바스크립트 프로젝트라고 해도 적게는 수십게 많게는 수백개의 다른 패키지에 의존하기 때문입니다.
대부분의 자바스크립트 패키지 매니저는 Node.js 실행 환경(runtime)에서 돌아가며 package.json
이라는 파일에 프로젝트가 의존하고 있는 패키지 목록을 명시합니다.
일반적으로 패키지는 프로젝트의 node_modules
디렉토리에 저장되는데, 주로 공개 npm 저장소(registry)로 부터 다운을 받지만 회사의 경우 사내망 내의 사설 저장소를 운영하는 경우도 있습니다.
package.json 파일에 대해서는 별도 포스팅에서 자세히 다루고 있으니 참고 바랍니다.
자바스크립트 커뮤니티에서는 npm과 Yarn이라는 두 가지 패키지 매니저가 오랫동안 시장을 양분해왔으며, Pnpm이나 Bun과 같은 새로운 패키지 매니저도 최근에 인기를 끌고 있습니다.
npm: 원조 패키지 매니저
npm(Node Package Manager의 약자인데 특이하게 모두 소문자로 씁니다)은 Node.js의 표준 패키지 매니저로서 Node.js 런타임을 설치하면 무조건 딸려오는 기본 패키지 매니저입니다. 이 말인즉슨, 별도로 설치할 필요가 없기 때문에 자바스크립트 입문자들이 가장 쉽게 접근할 수 있는 패키지 매니저라고 할 수 있겠습니다.
npm은 원조 패키지 매니저임에도 불구하고 다음 섹션에서 소개해드릴 Yarn의 인기에 밀려 한동안 개발자들이 기피했던 흑역사를 가지고 있는데요. 다행히도 최근에는 기존에 있던 대부분의 문제를 해결하고 Yarn의 장점을 모두 흡수하여 가장 대중적인 패키지 매니저로 자라잡아가고 있습니다.
따라서 가급적 최신 버전인 npm v8을 사용하시길 권장하며, 최소한 npm v6 이상을 쓰셔야 만족하실만한 경험을 하실 수 있으실 것입니다. (사실 이것은 Node.js만 업그레이드해도 자연스럽게 해결되기 때문에 크게 걱정하실 부분은 아니겠습니다.)
npm에 대해서 좀 더 자세히 알고 싶으신 분들은 아래 사이트를 참고 바랍니다.
- Github 저장소: https://github.com/npm/cli
- 공식 문서 사이트: https://docs.npmjs.com/cli
Yarn: 신흥 패키지 매니저
Yarn(Yet Another Resource Negotiator)은 Facebook에서 2016년에 만든 자바스크립트 패키지 매니저입니다. npm 보다 훨씬 빠르고 Workspaces와 같은 추가적인 기능까지 제공해서 출시하지마자 자바스크립트 커뮤니티에서 큰 주목을 받았습니다.
당시 npm 대비 Yarn의 가장 큰 강점은 yarn.lock
파일을 통해 패키지 버전 잠금을 지원하는 것이였는데요.
이를 통해 프로젝트에서 의존하는 모든 패키지를 어느 환경에서든 항상 동일한 버전으로 설치할 수 있게 만들어줬습니다.
패키지 버전 잠금에 대한 내용은 별도의 포스팅로 다루었으니 참고 바랍니다.
Yarn에 대해서 좀 더 자세히 알고 싶으신 분들은 아래 사이트를 참고 바랍니다.
- Github 저장소: https://github.com/yarnpkg/yarn
- 공식 문서 사이트: https://classic.yarnpkg.com
Yarn Berry: 논란의 시작
이렇게 npm과 Yarn으로 양분된 자바스크립트 패키지 시장에서 작년에 재미있는 일이 일어납니다. 바로 Facebook에서 오픈 소스로 독립한 Yarn이 Yarn Berry라고도 불리는 Yarn의 두 번째 버전을 발표하게 됩니다. 여기서 문제는 Yarn 2는 좋게 말하면 혁신, 나쁘게 말하면 Yarn 1과 호환을 포기했다고 봐도 좋을 정도로 크게 변했다는 점입니다.
소위 Plug’n’Play라고 불리는 이 새로운 패키지 관리 방식은 프로젝트의 node_modules
디렉토리에 패키지를 저장하지 않는다는 점에서 기존 패키지 매니저와 큰 차별점을 두었는데요.
이 방식은 성능 상의 이점에도 불구하고 자바스크립트 커뮤니티에서 호불호가 강해서 많은 프로젝트에서 Yarn 2로 넘어가는 것을 꺼리고 있는 상황입니다.
처음에 Yarn을 만든 Facebook의 개발팀에서도 Yarn 2를 공개적으로 비판을 하였으니 앞으로도 당분간 논란은 계속될 것으로 보입니다.
Yarn 2(Yarn Berry)에 대해서 좀 더 자세히 알고 싶으신 분들은 아래 사이트를 참고 바랍니다.
- Github 저장소: https://github.com/yarnpkg/berry
- 공식 문서 사이트: https://yarnpkg.com/
npm vs. Yarn: 당신의 선택은?
그러면 npm과 Yarn 중 관연 어떤 패키지 매니저를 사용해야 할까요? 두 패키지 매니저는 지난 몇년 간 서로의 영향을 받으며 꾸준히 발전해왔기 때문에 기능이나 성능 측면에서는 현재 거의 동일하다고 봐도 무방한 수준에 이르렀습니다.
사용자 입장에서 두 패키지의 가장 두드러지는 차이점은 패키지 버전 잠금을 위해 npm은 package-lock.json
파일을, Yarn은 yarn.lock
파일을 사용한다는 것입니다.
또한 Yarn의 CLI(Command Line Interface)는 대부분의 npm의 명령어(command)를 모방하고 있지만 조금씩 다른 부분도 있기 때문에 주의가 필요합니다.
대표적으로 npm은 새로운 패키지를 설치할 때, npm install
명령어를 사용하는 반면에 Yarn은 yarn add
명령어를 사용합니다.
Yarn의 가장 큰 단점을 뽑는다면 Node.js와 함께 설치되는 npm과 달리 개발자의 컴퓨터나 CI(Continuous integration) 서버에 별도로 Yarn을 따로 설치를 해야한다는 것입니다. 그럼에도 불구하고 Yarn은 터미널에서 명령어의 실행 결과가 npm보다 좀 더 예쁘게 나오는 등 개발자 경험 측면에서 아직도 npm 대비 매력적인 부분이 존재하는 것도 사실입니다.
저는 개인적으로 과거에는 Yarn이 확실한 우위에 있었기 때문에 한동안 Yarn을 줄곧 사용하다가 최근에는 다시 npm을 주로 사용하고 있습니다. 자바스크립트 입문자 분들께는 무조건 최신 버전의 npm을 권해드리고 있는데요. 현 시점에서 Yarn을 배우는데 시간을 투자하는 것 보다는 다른 기술을 익히는데 그 시간을 쓰는 게 나아보이기 때문입니다. 반대로 생각하면 기존에 Yarn을 사용하던 프로젝트에서 굳이 npm으로 바꿀 이유도 딱히 없어 보입니다.
신규 프로젝트에서 npm과 Yarn 중에 어떤 패키지 매니저를 선택할지 결정할 때 또 하나 고려할 부분이 있는데 미래에 각 패키지 매니저가 어떻게 발전할 것이냐는 것입니다. Yarn은 현재 Yarn 2가 삐꺽거리면서 상당히 과도기적인 시점에 있으며 Yarn 1은 공식적으로 더 이상 기능 추가를 하지 않겠다고 발표되었습니다. 반면에 npm은 최근 Github에 인수되었고 그 뒤에는 Microsoft가 있으니 지금처럼 앞으로도 지속적인 업데이트가 될 것으로 예상해볼 수 있습니다.
마치면서
이상으로 자바스크립트 패키지 매니저 대해서 간단히 살펴보았습니다. 사실 자바스크립트 생태계에서는 본 포스팅에서 다룬 npm과 Yarn 외에도 Pnpm과 같은 새로운 패키지 매니저가 줄줄이 등장하고 있습니다. 또한 차세대 자바스크립트 런타임인 Bun의 경우에는 아예 패키지 매니저를 내장하고 있어서 어떤 패키지 매니저를 사용할지 고민할 필요도 없습니다. 기본적으로 표준화보다는 자율성을 가치로 삼는 자바스크립트 커뮤니티에서 향후 이 패키지 매니저 전쟁이 어떻게 진행될지 지켜보면 흥미로울 것 같습니다.