패키지 매니져 정리 - 1편(npm vs yarn)

min_99·2024년 3월 16일

packagemanager

목록 보기
1/2
  1. 자바스크립트 런타임 환경인 노드(Nodes.js)의 패키지 매니져에 대해서 알아보자.
  2. 대표적인 패키지 매니져 npm , yarn, yarn berry에 대해서 알수 있다.

1. npm이 뭔가요?

  • Node Package Manager로, Node의 기본 패키지 매니져 입니다.

  • 이러한 패키지 매니져가 없다면, 저희는 github에 접속해서 소스코드를 다운로드 받아야 합니다. 또 버전 변경시에 다시 접속해서 소스코드를 재 다운로드를 받아서 재 업로드 해줘야 됩니다..ㅎ

  • 패키지 매니져의 탄생으로 관리의 문제가 개선되었지만, 완벽한 방법이란 없는 것.. 사용하다 보니 문제점이 발견이 되고, 이로 인해, npm , yarn, yarn berry,, 이렇게 발전을 하게됩니다


npm! 무엇이 문제였나?

1. 😵 환경세팅하는 사람들마다 버전이 다 제각각이야!! (일관되지 않은 버전관리)

1) 시멘틱 버저닝

  • 노드 모듈들은 기본적으로 시멘틱 버저닝 이라는 기법을 사용하여 모듈의 버전을 나타냅니다.
    *시멘틱 버저닝 : 1.0.0처럼 세가지 숫자로 구분하고 각 자리에 현재 버전이 이전버전과 어떤 관계가 있는지 암시하는 방법입니다.

2) 캐럿(^) 기호

  • 캐럿 기호를 이용해서 첫번째 숫자를 제외한 두자리(마이너,패치) 버전까지는 변경을 허용

3) 버전 불일치
따라서, npm install 명령어로 모듈을 설치하면 최신버전을 다운받게 됩니다.

버전 변경이 허용되기 떄문에 모듈간의 버전이 일치하지 않는 문제가 발생할 수 있다.

2. 🥵 고정되지 않은 설치 순서

  • 개발자의 환경에 따라 모듈들의 설치 순서가 변경 될 수 있다.
  • 이미 만들어진 프로젝트에서 모듈을 추가로 설치하게 될 경우 npm install 명령어를 통해 처음부터 설치하는 사람과의 설치순서가 달라질 수 있다.

    npm은 개발자들이 어떤 순서로 모듈을 추가했는지 알 수 없기 때문에 모듈 이름을 사전순서대로 정렬하여 순차적으로 설치한다.

3. 🤬 순차적인 설치로 인한 긴 소요시간(너무 오래걸려!!)

  • npm은 모듈을 한번에 하나씩 순차적으로 설치합니다.
    => 설치해야 되는 모듈이 많을수록 총 설치 시간이 길어지게 됩니다.

npm의 문제를 해결하여, yarn 출시!

1. 버전문제를 해결하다

  • 버전고정을 위해 yarn.lock 파일을 사용한다.
  • yarn.lock 파일로 개발자들의 항상 같은 버전의 모듈을 사용할 수 있도록 보장한다

[npm도 버전문제에 대한 개선방향을 내놓다!]

  • npm shrinkwrap
  • 하지만, npm의 경우 고정이 필요할 때마다 명령어를 입력해야 한다
  • yarn의 경우, 의존성이 달라질때마다 lock파일을 자동으로 추가하기 때문에 편리합니다.

2. 설치 확인을 위한 checksum

  • yarn은 checksum을 이용하여 패키지가 제대로 설치 되었는지 확인 합니다.
  • yarn.lock 파일을 확인해보면 resolved 주소뒤에 해시값이 추가되어 있는데, 이 해쉬값이 바로 checksum 입니다.
  • checksum은 패키지 파일의 무결성(정보가 변형되거나 손상되지 않았다)을 확인하는 안전장치 역할을 합니다.

3. 캐시를 통한 속도 개선

  • yarn은 한번 다운로드한 패키지라면 캐시를 해두기 때문에 다음부터는 매우 빠른 속도로 설치 할 수 있다.
  • 병렬 다운로드를 지원하기 때문에 모듈을 한번에 설치하여 속도가 빠르다.

✋🏻잠깐!

npm 왈 : 나도, 개선진행할께!

시간이 지나고 npm도 많은 부분이 개선되었습니다. package-lock 파일을 통해서 버전을 고정하고, 속도면에서도 yarn과 큰 차이가 없는 수준까지 따라왔습니다.

하지만, 두 패키지 매니저에도 문제가 존재했습니다.


1. 너무 무거운 node_modules!!!

  • npm에서 구성하는 node_modules폴더는 매우 큰 용량을 차지 합니다.

  • npm은 이 무거운 폴더를 경량화시키기 위해 호이스팅을 도입하였습니다.

  • 용량을 줄이는 가장 간단한 방법은 중복을 제거하는 것입니다.

  • node_modules의 중복된 패키지를 최소화하기 위해 각 패키지가 의존하는 패키지들을 최상단으로 끌어올립니다. 이렇게 되면 중복된 패키지가 최상단에 하나만 존재하게 되어 불필요한 중복을 제거할 수 있게 됩니다.


2. 유령 의존성

  • 하지만 이렇게 되면, 나는 설치한 적이 없지만 사용하는 패키지가 의존하고 있다는 이유만으로 사용하지 않는 패키지도 설치하게 됩니다. 이러한 현상을 유령 의존성이라고 부릅니다.
  • 따라서 비효율적인 설치와 유령 의존성 등은 여전히 npm과 yarn에게 숙제로 남아 있었습니다.
  • 하지만, yarn은 이러한 숙제를 해결한 v2를 공개(2020년 1월)했습니다

[참고자료]

0개의 댓글