Linux

Package Manager

bergerac 2025. 7. 9. 09:11

리눅스에서 개발을 하다 보면 apt, pip, npm, yum, dnf 같은 명령어를 무심코 쓰게 된다. 어떤 프로그램을 설치하거나 업데이트하거나, 때로는 의존성 문제를 해결하다 보면 반드시 만나게 되는 존재. 이게 바로 패키지 매니저다. 겉보기엔 단순한 설치 도구지만, 그 내부는 생각보다 복잡하고, 굉장히 중요한 역할을 수행한다.


패키지란?

패키지(package)는 일종의 포장된 코드다. 보통 하나의 기능을 수행하는 코드 집합을 "라이브러리(library)"라고 부르는데, 이 라이브러리를 다른 사람들이 쓸 수 있도록 잘 정리해놓고, 문서화하고, 이름을 붙이고, 설치 가능하게 만든 형태가 패키지다.
쉽게 말해:

  • 라이브러리 = 기능이 담긴 코드 모음
  • 패키지 = 포장지, 이름, 설치 방법이 포함된 배포 가능한 라이브러리

여기서 패키지 매니저는 이 "패키지"를 관리하는 도구다.


패키지 매니저가 필요한 이유

  • 설치와 삭제를 자동화
apt install curl
pip install requests
npm install express
  • 예전에는 새로운 기능이 필요하면 해당 라이브러리를 검색하고, 직접 코드를 다운로드받고, 파일을 복사하고, 설정 파일을 수정해야 했다.
    패키지 매니저는 이 과정을 단 한 줄의 명령어로 처리한다:
  • 의존성 관리패키지 매니저는 이 복잡한 트리를 자동으로 파악하고, 필요한 모든 패키지를 함께 설치한다. 또한 충돌이나 중복 설치를 방지하기 위해 버전 충돌을 자동으로 해결하거나 경고를 준다.
  • 대부분의 패키지는 내부적으로 다른 패키지에 의존하고 있다. 예를 들어 express라는 Node.js 웹 프레임워크는 수십 개의 패키지에 의존하고 있고, 그 중 일부는 또 다른 패키지를 참조한다. 이걸 의존성 트리라고 한다.
  • 업데이트 및 보안 관리
sudo apt update && sudo apt upgrade
  • 패키지 매니저를 이용하면 특정 패키지를 최신 버전으로 업그레이드하거나, 시스템 전체 패키지를 최신 상태로 유지할 수 있다.
    예를 들어 Ubuntu에서 다음 명령어로 모든 패키지를 최신 상태로 만들 수 있다:
  • 패키지 저장소와 연결된 생태계예시:
    • apt → Ubuntu/Debian의 공식 저장소
    • pip → PyPI (Python Package Index)
    • npm → npm Registry
  • 모든 패키지는 저장소(repository)라는 중앙 서버 혹은 커뮤니티 허브에 등록되어 있다. 사용자는 해당 저장소를 통해 패키지를 설치하며, 패키지 매니저는 이 저장소와 통신해서 원하는 버전, 메타데이터, 체크섬 등을 파악한다.

패키지 매니저의 종류

리눅스를 기준으로 보면, 다양한 패키지 매니저가 존재한다. 각 운영체제 혹은 언어별로 고유의 매니저가 있다.

시스템 기반 패키지 매니저

  • apt: Debian/Ubuntu 계열. .deb 파일 설치.
  • yum, dnf: Red Hat, CentOS, Fedora 등. .rpm 파일 설치.
  • pacman: Arch Linux
  • zypper: openSUSE

언어 기반 패키지 매니저

  • pip: Python
  • npm / yarn / pnpm: Node.js
  • gem: Ruby
  • cargo: Rust
  • composer: PHP
  • maven, gradle: Java

이 중 일부는 시스템 패키지 매니저로도 기능할 수 있다. 예컨대 brew는 macOS에서 시스템 패키지뿐 아니라 다양한 개발도구 설치에도 사용된다.


의존성(Dependency)과의 관계

패키지 매니저를 논할 때 빼놓을 수 없는 키워드가 의존성이다. 소프트웨어 개발은 결코 혼자 돌아가지 않는다. 하나의 기능을 구현하기 위해 수많은 외부 라이브러리들이 엮여 있고, 이 복잡한 관계를 파악하고 조율하는 것이 패키지 매니저의 핵심 기능이다.

의존성의 어려움

  • A 패키지는 B에 의존함
  • B는 C와 D에 의존함
  • D는 E의 특정 버전만 지원함
  • 그런데 F 패키지도 D를 사용하되, E의 최신 버전을 요구함

이런 경우를 의존성 충돌(Dependency Conflict) 또는 **지옥(Dependency Hell)**이라고 한다.
패키지 매니저는 이를 해결하기 위해 잠금(lock) 파일을 사용하거나, 트리 구조를 조정하거나, 가상 환경을 만드는 등의 전략을 사용한다.


실무에서 중요한 패키지 매니저 활용 팁

  1. 잠금 파일 확인
  2. package-lock.json, poetry.lock, Pipfile.lock 같은 파일은 설치 당시 의존성 트리를 고정시킨다. 실무에서는 이 파일을 git에 포함시켜, 팀원 간 환경 차이를 최소화해야 한다.
  3. 로컬 가상환경 추천
  4. Python이라면 venv를, Node.js라면 nvm을 통해 프로젝트별로 독립된 환경을 유지하면 의존성 충돌을 방지할 수 있다.
  5. 글로벌 설치 vs 로컬 설치
  6. 어떤 패키지는 전역(global)으로 설치해야 하고, 어떤 건 프로젝트 단위(local)로 설치해야 한다. 혼용 시 충돌이 생길 수 있다.

 
 

'Linux' 카테고리의 다른 글

Bash 제어 흐름  (1) 2025.07.12
Bash 변수와 배열의 기초  (1) 2025.07.11
Linux file system 명령어 실습  (5) 2025.07.10
Linux- 파일과 디렉토리 구조  (2) 2025.07.08
리눅스(Linux)란 무엇인가?  (2) 2025.07.07