패키지 매니저
Package Manager
라이브러리 설치와 의존성 관리 도구. npm, pip, cargo, go mod가 대표적.
Package Manager
라이브러리 설치와 의존성 관리 도구. npm, pip, cargo, go mod가 대표적.
패키지 매니저(Package Manager)는 소프트웨어 라이브러리의 설치, 업데이트, 제거, 의존성 관리를 자동화하는 도구입니다. 개발자가 직접 라이브러리를 다운로드하고 경로를 설정하는 수고를 덜어주며, 버전 충돌 문제도 해결해줍니다. 현대 소프트웨어 개발에서 필수적인 도구입니다.
언어별로 대표적인 패키지 매니저가 있습니다. JavaScript는 npm과 yarn, pnpm을, Python은 pip과 conda, poetry를, Rust는 cargo를, Go는 go mod를 사용합니다. 각 패키지 매니저는 중앙 저장소(registry)에서 패키지를 가져옵니다.
의존성 관리는 패키지 매니저의 핵심 기능입니다. package.json, requirements.txt, Cargo.toml 등의 파일에 프로젝트가 필요로 하는 패키지와 버전을 명시합니다. lock 파일(package-lock.json, Cargo.lock 등)은 정확한 버전을 기록하여 재현 가능한 빌드를 보장합니다.
시맨틱 버저닝(SemVer)을 이해하면 의존성을 더 잘 관리할 수 있습니다. MAJOR.MINOR.PATCH 형식에서 ^1.2.3은 1.x.x 범위, ~1.2.3은 1.2.x 범위를 의미합니다. 버전 범위를 적절히 지정하면 보안 패치를 자동으로 받으면서도 호환성을 유지할 수 있습니다.
# npm (JavaScript)
npm init -y # 프로젝트 초기화
npm install express # 패키지 설치
npm install -D typescript # 개발 의존성 설치
npm update # 패키지 업데이트
npm audit # 보안 취약점 검사
# pip (Python)
pip install requests # 패키지 설치
pip install -r requirements.txt # 파일에서 설치
pip freeze > requirements.txt # 의존성 내보내기
pip install --upgrade pip # pip 자체 업그레이드
# cargo (Rust)
cargo new myproject # 프로젝트 생성
cargo add serde # 패키지 추가
cargo build # 빌드
cargo update # 의존성 업데이트
# go mod (Go)
go mod init myproject # 모듈 초기화
go get github.com/gin-gonic/gin # 패키지 추가
go mod tidy # 미사용 의존성 정리
# pnpm (npm 대안, 효율적인 디스크 사용)
pnpm install # node_modules 설치
pnpm add lodash # 패키지 추가
시니어: node_modules가 너무 커서 CI 빌드가 느려요. pnpm으로 바꾸면 어떨까요?
주니어: pnpm이 npm과 뭐가 다른가요?
시니어: 심볼릭 링크로 패키지를 공유해서 디스크 사용량이 훨씬 적어요. 설치 속도도 빠르고요. 기존 package.json을 그대로 쓸 수 있어서 마이그레이션도 쉽습니다.
면접관: package-lock.json의 역할이 무엇인가요?
지원자: 의존성 트리의 정확한 버전을 기록합니다. package.json에 ^1.0.0으로 지정하면 1.x.x 범위에서 변할 수 있지만, lock 파일이 있으면 모든 환경에서 동일한 버전이 설치됩니다. 재현 가능한 빌드에 필수적입니다.
면접관: devDependencies와 dependencies의 차이는요?
지원자: dependencies는 프로덕션에 필요한 패키지이고, devDependencies는 개발 시에만 필요한 테스트 도구, 린터 등입니다. npm install --production은 devDependencies를 제외합니다.
리뷰어: 이 패키지 버전이 ^대신 *로 되어 있는데, 위험해요.
작성자: 항상 최신 버전 쓰려고 했는데요.
리뷰어: 메이저 버전 변경 시 breaking change가 있을 수 있어요. ^로 지정하면 패치와 마이너 업데이트만 받아서 안전합니다.