패키지 매니저 톺아보기

권지현·2023년 6월 15일

회사에서 진행중인 프로젝트 외에 다른 프로젝트를 인수인계 받으면서 작은 문제를 겪었다. 패키지 매니저와 관련된 문제인데 정확히 작동 원리나 배경 지식이 없으니 원인을 찾는 것부터 시간을 엄청 썼다. 결론은 package-lock.json파일이 없어서 패키지 버전 오류로 확인됐다. 이 오류를 계기로 관련 지식을 기록해놔야겠다는 필요성이 들어서 정리해보려고한다.

npm, yarn의 설치 방식

보통 일반적으로 사용하는 npm, yarn는 여러 방식을 통해 패키지 의존성을 관리한다.

package-lock.json/ yarn.lock - package.json에 명시된 파일을 설치하는 과정에서 lock 파일을 참조해 정확한 버전을 설치한다.
의존성 트리 - 패키지의 의존성은 트리 구조로 나타낸다. 루트 패키지는 package.json에 명시된 패키지를 기준으로 하위에 의존하는 다른 패키지가 나열되는 방식이다.
의존성 해결 알고리즘 - 패키지가 의존하는 다른 패키지의 버전 충돌이 발생하면, 이를 해결하기 위해 적절한 버전을 선택해서 설치한다.

예를 들어, A,B 패키지 의존성으로 설치된 C패키지가 ^1.0.2버전과 ^2.0.0버전을 요구할 때 모두를 만족시키는 ^2.0.0 ~ 3.0.0 미만을 설치하는 방식으로 의존성을 해결한다.

조금 더 세부적으로 npm과 yarn의 차이를 보면,

  1. yarn 특징
  • 병렬적 설치(효율, 시간 단축)
    패키지 A,B,C를 설치한다고 가정했을 때,
    npm - A 설치 후 B 설치, C 설치
    yarn - A,B,C 패키지를 모두 동시에 설치
  • 캐싱(시간 단축)
    패키지를 한 번 다운로드하고 로컬 저장소에 캐싱해둔다.
    A프로젝트에 B패키지 설치 후 C프로젝트에서 동일한 B패키지를 설치할 경우 인터넷에 접속하지 않아도 캐시된 데이터를 통해 패키지를 설치한다.
  • checksum(보안)
    패키지 파일이나 리소스를 다운로드할 때 id(체크섬값)값을 함께 가져와 기록해둔 뒤 데이터가 손상되지 않았는지 확인하기 위해 저장된 id값으로 비교한 뒤 오류가 있을 경우 에러를 발생시키는 방식으로 보안을 강화한다.
	//yarn.lock 주소와 함께 해시값이 함께 저장되어있음
	resolved "https://registry.yarnpkg.com/@ajna/pagination/-/pagination-1.4.19.tgz#checksum값"

이러한 패키지 설치의 단점으로는,

  • npm, yarn 모두 의존성 해결을 위해 의존하고 있는 패키지를 최상단에 설치한다. 그로 인해 직접 설치하지않은 패키지도(예: date-picker 설치 시, datejs가 함께 설치되는 것) 최상단에 저장되어 유령 의존성이 발생한다.
    • 비슷한 문제로 마이그레이션시에도 다른 버전을 import해서 사용하고 있을 수도 있어 이런 경우에도 에러 발생 가능성 O
  • ^1.7.0 버전을 설치한 상황에서는(첫번째가 변하지 않는 한 1.7.0과 1.7.5버전을 모두 사용할 수 있다) lock.json 파일이 없을 경우 의존성 문제가 생긴다.
profile
FE 개발자 성장 기록 👩🏻‍💻

0개의 댓글