패키지 매니저 톺아보기

권지현·2023년 6월 15일
0

회사에서 진행중인 프로젝트 외에 다른 프로젝트를 인수인계 받으면서 작은 문제를 겪었다. 패키지 매니저와 관련된 문제인데 정확히 작동 원리나 배경 지식이 없으니 원인을 찾는 것부터 시간을 엄청 썼다. 결론은 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개의 댓글