[패키지 매니저] npm, pnpm, yarn 사아알짝 보기

soap·2025년 12월 4일

프론트

목록 보기
4/4

리액트 기초 다질 겸 과제도 준비할 겸 블로그를 하나 만들고 있는데
npm install 하다가.. 내가 패키지 매니저에 대해서 공부를 제대로 한 적이 있던가..? 라는 생각을 하며 정리해보려고 한다.
공부하다보니 최근 프로젝트에서 package-lock.json 파일 때문에 고생을 한 것이 사실은 기본적인게 개념이 안 잡혀 있어서 그랬다는 걸 깨달은 건 안 비밀...입니다.



패키지 매니저란?

간단하게 말하면 버저닝 문제 해결사.

모든 사람이 같은 버전을 쓰면 좋으련만,, 언제 설치했는지 어떤 네트워크 환경인지에 따라 쓰는 버전이 다르다. 모든 개발자가 독같은 버전을 설치하게 만들자! 가 목적

{
  "dependencies": {
    "react": "^18.2.0" 
  }
}

^ 이 붙으면 18.x.x 버전 전부 가능하다. 이렇게 명시가 되어 있다면 앞서 말했든지 사용하는 사람마다 다른 버전이 설치될 수 있다.

패키니 매니저 종류 : npm, pnpm, yarn

lock 파일을 보면 어떤 패키지 매니저를 사용하는지 알 수 있다.

npm만 스크립트 실행문이 다르다. 다만 기본적인

start, test, stop, restart

는 run 없이 실행




패키지 매니저가 동작하는 3가지 단계

Resolution, Fetch, Link

Resolution

1) 의존성 버전 고정
2) 의존성의 의존성도 고정
3) 그 결과를 파일(lock 파일) 에 저장

npm : package-lock.json
pnpm : pnpm-lock.yaml
yarn : yarn.lock

Fetch

Resolution의 결과로 결정된 버전을 실제로 다운로드 하는 과정

Resolution, Fetch 된 라이브러리를 소스코드에서 사용할 수 있는 환경을 제공하는 과정으로 설치한 의존성을 import 할 수 있도록 하는 것이다.

Link 방식이 3가지 패키지 매니저마다 다르다.

패키지 매니저Linker 방식설명생성 파일
npmnpm Linkernode_modules에 실제 파일을 복사해 설치package-json.lock
pnpmpnpm LinkerHard Link(Copy-on-write) 기반, 용량/속도 최적화pnpm-lock.yaml
Yarn v1 (Classic)node_modules Linkernpm과 동일 방식(호환성 우수)yarn.lock
Yarn v2+ (Berry)PnP (Plug’n’Play)node_modules 없이 Map 기반으로 의존성 관리yarn.lock , yarnc.yaml, pnp.cjs
  • npm은 하나의 책을 사람들이 사용하기 위해 전부 다 복사본을 만들어서 책을 보는 것
  • pnpm은 하나의 책을 접속하는 링크를 생성해서 그 책을 보는 것
  • yarn은 도서 DB에서 책 위칫값만 관리하여 필요할 때 즉시 제공

이라고 비유를 하면 그렇다.


이러한 3단계의 과정 때문에 우리는 버전이 다른 팀원과 협업할 수 있는 것이다.

아까 .. 고생은.. 사실 나름 1시간동안 팀원과 고민했던 것이였는데 pull받고 merge 해서 lock 파일도 동일한데 실행하면 충돌/오류가 나는 문제가 있었다. 그렇다고 ignore 파일에 package-lock.json 넣는 것도 말도 안되는 상황이였다.

사실 우린 변경사항만 다운로드 한 것이지, 실제 설치된 패키지를 업데이트 한 것이 아니였다.
npm install -> npm run ~

최신 의존성 설치 이후 실행하자는 패키지 관리 워크플로우를 얻는 경험이였다. 기본에 충실하자.




캡처 이미지 자료 : https://young-taek.tistory.com/366
토스 테크 블로그 : 패키지 매니저

profile
치열하게 살지는 않아도 후회되는 순간은 만들지 말자

0개의 댓글