패키지 매니저란?
- 패키지 매니저(Package manager)는 패키지를 다루는 작업을 편리하고 안전하게 수행하기 위해 사용되는 툴이다.
- 여기서 패키지를 다루는 작업이란 패키지를 설치, 업데이트, 수정, 삭제하는 작업을 의미한다.
패키지가 뭔데요? 어디에 쓰는 건가요?
- 패키지는 라이브러리(library)와 유사한 개념이다.
- 라이브러리가 코드의 작성을 위해 사용되는 코드의 묶음이라면, 패키지는 코드의 배포를 위해 사용되는 코드의 묶음이다.
- 따라서 패키지는 경우에 따라 라이브러리를 포함할 수도 있으며, 일반적으로 라이브러리나 실행 파일(executable)을 포함한다.
- 패키지는 다음 3가지 정보를 가지고 있는 코드의 배포 단위이다.
- 컴파일한 소프트웨어의 바이너리(binary)
- 환경 설정(configuration)에 관련된 정보
- 의존(dependency)에 관련된 정보
Dependency가 뭐에요? 그 정보를 왜 가지고 있어야 하는 거죠?
- 많은 패키지들은 다른 패키지가 설치되어 있어야만 제대로 동작한다.
- 이 경우에 기존 패키지를 제대로 동작시키기 위해 필요한 다른 패키지를 'dependency'라고 말한다.
- 따라서 패키지를 사용하고자 할 때 dependency에 해당되는 다른 패키지들을 전부 설치해줄 필요가 있다.
- 하지만 그런 새로운 패키지(dependency)들을 설치하는 도중 이번엔 설치하고 있는 패키지의 dependency를 설치해야 하는 상황이 발생할 수 있다.
- 즉, dependency의 dependency를 설치하는 경우가 생기며, 이런 상황이 끊임없이 이어질 경우 사용자가 수동으로 패키지를 관리하기가 불가능에 가까워진다. 이런 상황을 dependency hell이라고 한다.
- 따라서 각각의 패키지가 자신의 dependency에 대한 정보를 가지게 한다면, 사용자가 사용하고자 하는 패키지의 dependency를 패키지 매니저를 통해 쉽게 설치하도록 도울 수 있다.
그럼 패키지 매니저는 dependency만 관리하나요?
- 패키지 매니저가 공통적으로 수행하는 일은 다음과 같다.
- 패키지의 dependency 관리
- 패키지의 보안관리 ㅡ 신뢰할 수 있고(authenticity), 손상되지 않음(integrity)을 보장
- 여러 패키지를 기능에 따라 그룹으로 묶어 정리
- 패키지 압축 해제
- 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 |
참고한사이트: https://aahc.tistory.com/14