패키지 매니저
Package Manager
패키지 매니저란?
- 외부 라이브러리 설치·관리 도구
- npm·pip 등
- 의존성 관리
패키지 매니저가 실제로 바꾸는 것은 라이브러리를 '가져오는' 방법이 아니라 '적어두는' 방법입니다. 예전에는 필요한 파일을 각자 내려받아 프로젝트 폴더에 복사해 넣었고, 몇 달 지나면 누가 어떤 버전을 왜 넣었는지 아무도 설명하지 못했습니다. 지금은 저장소에 부품 실물 대신 필요한 부품의 목록 파일만 두고, 실제 설치는 명령이 대신합니다. 그래서 신입 개발자가 첫 출근한 날 저장소를 내려받고 설치 명령 한 번만 치면 선배와 똑같은 개발 환경이 만들어집니다.
실무에서 가장 많이 헷갈리는 지점은 선언 파일과 잠금 파일의 차이입니다. package.json에 `^4.17.1`이라고 적으면 '4점대 안에서 최신이면 무엇이든'이라는 뜻이라, 같은 명령을 어제와 오늘 실행해도 다른 버전이 깔릴 수 있습니다. 이를 한 줄 한 줄 고정해 주는 것이 package-lock.json·poetry.lock 같은 잠금 파일이고, 배포 서버에서는 install 대신 ci 계열 명령을 써서 잠금 파일 그대로만 설치하게 막습니다. 여기에 테스트 도구처럼 개발할 때만 쓰는 패키지와 운영에 실제로 올라가는 패키지를 나눠 적고, 보안 심사를 받는 회사라면 사내 프록시 저장소(Nexus·Artifactory)를 두고 승인된 패키지만 통과시킵니다.
사고는 대개 세 곳에서 납니다. 첫째, 잠금 파일을 자동 생성물이라 여겨 .gitignore에 넣어버리는 경우입니다. '제 PC에서는 되는데 서버에서만 안 됩니다'의 상당수가 여기서 나옵니다. 둘째, AI가 실제로 존재하지 않는 패키지 이름을 자신 있게 제시하는 경우입니다. 공격자는 그 그럴듯한 이름을 미리 선점해 악성 코드를 올려두기도 하므로, 설치 전에 주간 다운로드 수와 최종 업데이트 날짜는 눈으로 확인해야 합니다. 셋째는 라이선스입니다. GPL 계열 라이브러리를 고객사에 납품하는 제품에 넣으면 소스 공개 요구를 받을 수 있어 계약 단계에서 문제가 됩니다. 명령 한 줄이 수백 개의 간접 의존성을 함께 끌고 들어온다는 점을 잊으면, 내가 쓴 적 없는 코드가 우리 제품의 책임 범위가 됩니다.
의존성 설치를 자동화하는 도구로 발전했고, 2010년 등장한 npm(자바스크립트)이 세계 최대 패키지 생태계를 이루며 대중화됐습니다.
가상의 사례로 살펴보겠습니다. 임직원 180명 규모의 식자재 유통사 A사는 수기 엑셀로 돌리던 지점 주문 업무를 사내 웹 서비스로 옮기기로 하고, 외주 없이 개발자 2명이 4개월간 직접 만들었습니다. 개발은 순조로웠는데 운영 서버에 올릴 때마다 원인 모를 오류가 났습니다. 3주 동안 배포 5번이 모두 실패하면서 오픈 일정이 2주 밀렸습니다.
- 개발팀장이 로그를 뒤져 원인을 찾아보니, 같은 설치 명령인데도 개발 PC에는 4.17 버전이, 운영 서버에는 4.18 버전이 깔려 있었습니다. 버전을 고정하는 잠금 파일이 저장소에 없었던 것이 화근이었습니다.
- 담당 개발자는 "자동으로 생기는 파일이라 굳이 올릴 필요 없는 줄 알았습니다"라고 했고, 팀장은 잠금 파일을 .gitignore에서 빼 커밋하게 한 뒤 배포 스크립트의 install 명령을 잠금 파일 그대로만 설치하는 ci 명령으로 바꿨습니다.
- 정보보안 담당자가 취약점 점검 명령을 돌려 12건을 찾아냈고, 이 중 고위험 2건은 해당 라이브러리를 상위 버전으로 올려 그 주에 정리했습니다. 나머지 10건은 개발용 패키지라 운영 영향 없음으로 기록에 남겼습니다.
- AI 코딩 도구가 제안한 패키지 7개를 검증하다 실제로 존재하지 않는 이름 1개를 발견했습니다. 팀은 '주간 다운로드 1만 건 이상, 최근 6개월 내 업데이트'를 설치 전 확인 기준으로 정해 위키에 붙여뒀습니다.
- 라이선스를 훑다가 GPL 계열 라이브러리 1개가 들어와 있는 것을 확인하고, 법무 검토를 거쳐 MIT 라이선스 대체 패키지로 교체했습니다. 지점용으로 배포되는 서비스라 그대로 뒀다면 소스 공개 요구를 받을 수 있는 상황이었습니다.
- 정리 후 3개월간 배포 21회 중 환경 차이로 인한 실패는 0건이었고, 신규 입사 개발자의 환경 셋업 시간도 반나절에서 20분으로 줄었습니다.