개발/끄적끄적

TIL #30 NPM & Yarn

JWOOKJ 2021. 6. 7. 00:02

 

📌 패키지 매니저(Package manager)

패키지 매니저(Package manager)란 프로젝트에서 사용하는 라이브러리들의 관리를 용이하게 해주는 툴(Tool)로써, 

NPM, gradle, pip, composer 등이 있다. 

 

그중 NPM(Node package manager)과 yarn자바스크립트 패키지 매니저로 자바스크립트 프로젝트에는 거의 필수로 사용되고 있다. 

 

이번 글에서는 이 둘의 차이점에 대해 알아보려고 한다. 

 

(사실상 여러 면에서 npm과 yarn 모두 업데이트가 되어왔기 때문에 큰 차이는 없다고 생각해도 될 것 같다.)

npm trends


📌 NPM(Node Package Manager)

npm은 node.js를 설치하면 자동으로 설치되는 패키지 매니저로 가장 범용적으로 사용되고 있다. 

그만큼 커뮤니티도 크고, 오류 해결에 대한 정보도 많다. (yarn도 많다. 그냥 npm이 더 오래 쓰여왔으니까....)

 

npm은 package.json이라는 파일에 모듈의 종속성을 관리한다.

package.json은 json이라는 확장자의 이름대로 json 형식대로 작성되어 있는데, 협업에 있어 굉장히 중요한 파일이다.

 

라이브러리들은 기술이 발전해 가면서, 계속해서 업데이트되거나 deprecated(비권장)되기도 한다.

 

이 경우 지원되던 기능이 안되거나, 변경되거나, 새로운 기능이 추가되는 경우가 있는데,

프로젝트에서 사용하는 라이브러리의 버전을 package.json에 명시해줌으로써

현재 자신이 사용 중인 라이브러리의 버전과 비교하여 사용해야 하는 버전을 정할 수 있게 된다. 

 

또한 사용하는 모든 라이브러리의 코드를 버전 관리 툴을 통해 서로 공유하게 되면
너무 큰 용량의 파일들을 서로 주고받아야 하기 때문에 효율성이 떨어지게 되는데, 

이때 라이브러리의 모든 코드가 아닌, 사용 중인 라이브러리의 정보가 저장된 package.json 파일만 전달해주고,

전달받은 개발자는 기록된 버전에 맞는 라이브러리를 로컬에서 설치하게 되면 좀 더 빠르고 정확하게 협업이 진행될 수 있다. 

정확히는 npm은 package.json내에 SemVer(semantic versioning)를 이용해 라이브러리의 version range를 저장한다.
Sementic Versionin

📌 Yarn

기존에 사용되던 npm의 단점을 해결하기 위해 facebook에서 출시한 자바스크립트 패키지 매니저이다.

 

npm을 통해 설치할 수 있고, npm을 사용하고 싶지 않다면, mac의 경우 brew, 윈도우의 경우 직접 msi파일을 다운로드하거나, chocolaty와  scoop을 이용하여 설치할 수 있다. 

yarn install

 

yarn은 모듈의 종속성을 관리하기 위한 파일로 yarn.lock파일을 사용한다. 

 

yarn.lock은 라이브러리의 version range를 기록하는 package.json과 다르게 라이브러리가 설치되는 시점의 정확한 버전을 기록함으로써, 협업 간의 버전 통일성을 더욱 강화시켰다. 

package.json에서 version range에 의지하는 방식에서 생기는 문제를 해결하기 위해 npm도 package-lock.json파일을 생성하도록 업데이트 하였다.
package-lock.json파일이 존재할 경우 npm은 package.json이 아닌 package-lock.json파일을 참조하여 라이브러리를 설치하게 된다. 

 

npm은 라이브러리 설치 시 순서대로 설치하는 반면, yarn은 병렬적으로 설치를 하게 돼서 속도면에서 yarn이 우위를 갖는다고 한다. 

현재도 yarn이 속도에서 우세하다고 하지만 npm의 계속된 업데이트로 인해 그 차이는 미미하다고 한다.
(라이브러리를 재설치하는 경우 yarn의 캐싱 메커니즘이 속도가 훨씬 빠르다고 한다.)

📌 정리

npm은 처음 자바스크립트 프로젝트의 패키지 매니저 툴로 사용되었고 몇 가지 단점들이 존재했다.

이러한 단점들을 해결하기 위해 yarn이 나왔고 npm과 yarn은 서로의 장점을 취합하여 계속해서 업데이트를 해오고 있다.

 

지금은 사실 '어떠한 패키지 매니저가 더 좋다'라고 말할 수는 없는 것 같다.

그냥 자신에게 익숙한 툴을 쓰거나, 팀에서 정한 툴을 사용하는 것이 옳다고 생각한다. 

 

실제로 npm과 yarn 측 모두 업데이트를 할 때마다 두 패키지 매니저간의 호환성을 고려하고 있다. 

play nicer with yarn

yarn import now uses package-lock.json

하지만 아직까지는 한 프로젝트에서는 하나의 패키지 매니저를 사용하도록 권장한다 ! 우리가 모르는 충돌이 있을 수 있으니까 ! 

 

결국 두 가지 툴을 모두 잘 사용할 수 있어야 하고, 업데이트 내용에 따라서 장단점을 잘 파악해야 하겠다. 

 

 

6.9 추가! 
package.json은 왜 버전을 범위에 의존할까 궁금해서 찾아보았다. 
Introduction to Version Ranges

위의 글에서 'Why should I use version ranges?' 파트의 글을 요약해보면,
예를 들어 사용된 라이브러리의 버그를 수정한 새 버전이 릴리스 되었을 경우 따로 사용자가 직접 package.json에서 수정해줄 필요 없이 업데이트된 버전을 적용하여 프로젝트의 안정성과 편의성을 위해서 설계되었다고 한다.

📌 참고

https://www.whitesourcesoftware.com/free-developer-tools/blog/npm-vs-yarn-which-should-you-choose/

 

NPM vs. Yarn: Which Package Manager Should You Choose?

We’ll be comparing NPM vs. Yarn side by side so that you can make the right decision on the one to go for when working on your projects.

www.whitesourcesoftware.com

 

🎮  command

같은 commend

다른 command

서로에게 없는 기능 command