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

간단하게 말하면 버저닝 문제 해결사.
모든 사람이 같은 버전을 쓰면 좋으련만,, 언제 설치했는지 어떤 네트워크 환경인지에 따라 쓰는 버전이 다르다. 모든 개발자가 독같은 버전을 설치하게 만들자! 가 목적
{
"dependencies": {
"react": "^18.2.0"
}
}
^ 이 붙으면 18.x.x 버전 전부 가능하다. 이렇게 명시가 되어 있다면 앞서 말했든지 사용하는 사람마다 다른 버전이 설치될 수 있다.
lock 파일을 보면 어떤 패키지 매니저를 사용하는지 알 수 있다.

npm만 스크립트 실행문이 다르다. 다만 기본적인
start, test, stop, restart
는 run 없이 실행

Resolution, Fetch, Link
1) 의존성 버전 고정
2) 의존성의 의존성도 고정
3) 그 결과를 파일(lock 파일) 에 저장
npm : package-lock.json
pnpm : pnpm-lock.yaml
yarn : yarn.lock
Resolution의 결과로 결정된 버전을 실제로 다운로드 하는 과정
Resolution, Fetch 된 라이브러리를 소스코드에서 사용할 수 있는 환경을 제공하는 과정으로 설치한 의존성을 import 할 수 있도록 하는 것이다.
Link 방식이 3가지 패키지 매니저마다 다르다.
| 패키지 매니저 | Linker 방식 | 설명 | 생성 파일 |
|---|---|---|---|
| npm | npm Linker | node_modules에 실제 파일을 복사해 설치 | package-json.lock |
| pnpm | pnpm Linker | Hard Link(Copy-on-write) 기반, 용량/속도 최적화 | pnpm-lock.yaml |
| Yarn v1 (Classic) | node_modules Linker | npm과 동일 방식(호환성 우수) | yarn.lock |
| Yarn v2+ (Berry) | PnP (Plug’n’Play) | node_modules 없이 Map 기반으로 의존성 관리 | yarn.lock , yarnc.yaml, pnp.cjs |
이라고 비유를 하면 그렇다.
이러한 3단계의 과정 때문에 우리는 버전이 다른 팀원과 협업할 수 있는 것이다.
아까 .. 고생은.. 사실 나름 1시간동안 팀원과 고민했던 것이였는데 pull받고 merge 해서 lock 파일도 동일한데 실행하면 충돌/오류가 나는 문제가 있었다. 그렇다고 ignore 파일에 package-lock.json 넣는 것도 말도 안되는 상황이였다.
사실 우린 변경사항만 다운로드 한 것이지, 실제 설치된 패키지를 업데이트 한 것이 아니였다.
npm install -> npm run ~
최신 의존성 설치 이후 실행하자는 패키지 관리 워크플로우를 얻는 경험이였다. 기본에 충실하자.

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