개발

패키지 매니저(Package Manager)란?

aahcbird 2019. 11. 12. 18:58

패키지 매니저란?

  • 패키지 매니저(Package manager)는 패키지를 다루는 작업을 편리하고 안전하게 수행하기 위해 사용되는 툴이다.
  • 여기서 패키지를 다루는 작업이란 패키지를 설치, 업데이트, 수정, 삭제하는 작업을 의미한다.

 

패키지가 뭔데요? 어디에 쓰는 건가요?

  • 패키지는 라이브러리(library)와 유사한 개념이다.
  • 라이브러리가 코드의 작성을 위해 사용되는 코드의 묶음이라면, 패키지는 코드의 배포를 위해 사용되는 코드의 묶음이다.
  • 따라서 패키지는 경우에 따라 라이브러리를 포함할 수도 있으며, 일반적으로 라이브러리나 실행 파일(executable)을 포함한다.
  • 패키지는 다음 3가지 정보를 가지고 있는 코드의 배포 단위이다.
    1. 컴파일한 소프트웨어의 바이너리(binary)
    2. 환경 설정(configuration)에 관련된 정보
    3. 의존(dependency)에 관련된 정보

 

Dependency가 뭐에요? 그 정보를 왜 가지고 있어야 하는 거죠?

  • 많은 패키지들은 다른 패키지가 설치되어 있어야만 제대로 동작한다.
  • 이 경우에 기존 패키지를 제대로 동작시키기 위해 필요한 다른 패키지를 'dependency'라고 말한다.
  • 따라서 패키지를 사용하고자 할 때 dependency에 해당되는 다른 패키지들을 전부 설치해줄 필요가 있다.
  • 하지만 그런 새로운 패키지(dependency)들을 설치하는 도중 이번엔 설치하고 있는 패키지의 dependency를 설치해야 하는 상황이 발생할 수 있다.
  • 즉, dependency의 dependency를 설치하는 경우가 생기며, 이런 상황이 끊임없이 이어질 경우 사용자가 수동으로 패키지를 관리하기가 불가능에 가까워진다. 이런 상황을 dependency hell이라고 한다.
  • 따라서 각각의 패키지가 자신의 dependency에 대한 정보를 가지게 한다면, 사용자가 사용하고자 하는 패키지의 dependency를 패키지 매니저를 통해 쉽게 설치하도록 도울 수 있다.

 

그럼 패키지 매니저는 dependency만 관리하나요?

  • 패키지 매니저가 공통적으로 수행하는 일은 다음과 같다.
    1. 패키지의 dependency 관리
    2. 패키지의 보안관리 ㅡ 신뢰할 수 있고(authenticity), 손상되지 않음(integrity)을 보장
    3. 여러 패키지를 기능에 따라 그룹으로 묶어 정리
    4. 패키지 압축 해제
    5. Software repository로부터 패키지를 찾고, 다운로드하고, 설치하고, 업데이트하는 역할

 

Software repository는 뭔가요?

  • 패키지를 저장하고 관리하는 저장소이다. 다른 말로는 repos라고 부른다.
  • 커뮤니티에 기여하는 것을 목적으로 다른 사용자들을 위해 패키지를 등록할 수도 있다.
  • 성능 문제(load balancing)와 위기상황 대처(fault tolerant)를 위해 여러 개로 분리되어있으며, 각각의 저장소가 동일한 기능을 수행한다.
  • Software repository에 대한 위치 정보를 관리하는 환경 설정 파일이 존재하므로, 그 경로를 참고하여 software repository에 접근하는 방식을 사용한다.

 

패키지 매니저의 예

  • 패키지 매니저는 운영체제와 프로그래밍 언어에서 사용되는 툴이다.
  • Ubuntu 운영체제의 apt(Advanced Package Tool)가 대표적인 운영체제 패키지 매니저의 예다.
  • 예를 들어 콘솔을 사용한 sudo apt-get install 명령어를 통해 패키지를 설치할 수 있다.
  • Python과 PHP, Node.js 등 많은 프로그래밍 언어들은 각각 자신만의 패키지 매니저와 software repository를 가지고 있다.
  • 여러 종류의 패키지 매니저와 software repository를 가진 언어도 존재한다. (Node.js, Java, Ruby...)

 

Language Package manager Software repository
Python pip PyPI
PHP Composer Packagist
Node.js NPM, Yarn NPM, Yarn
Java Maven, Gradle Maven
Ruby RubyGems, Bundler RubyGems, Bundler

 

참고한 자료