패키지 매니저(Package manager)는 패키지를 다루는 작업을 편리하고 안전하게 수행하기 위해 사용되는 툴이다.
여기서 패키지를 다루는 작업이란 패키지를 설치, 업데이트, 수정, 삭제하는 작업을 의미한다.
쉽게 말해서, 패키지 매니저는 마치 윈도우의 "앱 추가/제거" 기능과 같이, 프로그램을 삭제하거나 관리하는데 쓰는 도구이면서, 동시에 앱스토어와 같이 새로운 프로그램을 추가할 수 있는 도구이기도 하다.
다만, 위와 같이 GUI로 구성되어 있지 않고, 명령어를 직접 터미널에 입력해야 한다.
전통적으로 리눅스와 같이 Unix 계열의 운영체제에서 프로그램을 설치할 때에는, 오픈소스 프로그램이 대다수였기 때문에, 소스코드를 다운로드 받아 해당 컴퓨터의 환경에 맞게 실행가능한 형태로 만들어주는 컴파일 과정을 겪었다. 그러나 이 과정을 위해 다른 프로그램이 의존성(dependency)을 가지는 경우가 많아서, (윈도우 운영체제에서 특정 프로그램을 설치하기 위해 .NET Framework 같은 것을 필요로 했던 경험을 떠올려 보자ㅠ.ㅠ) 이러한 문제를 한꺼번에 해결해주는 솔루션이 필요하게 되었다. 이것이 바로 패키지 매니저이다.
그렇다면, 앱스토어같은 곳에서 프로그램을 설치할 수는 없을까요??? 안타까운 소식일지도 모르지만, 개발자들은 특정 회사에 종속적인 스토어에서 프로그램을 배포하지 않는다. 앱스토어에서 node.js와 같은 개발 툴을 찾기 어려운 이유이기도 하다.
대부분의 개발 도구들은 패키지 매니저를 통해 설치할 수 있습니다. 운영체제 별 패키지 매니저를 알아봅시다.
우분투의 경우, apt 패키지 매니저는 기본적으로 설치되어 있으며, macOS에서 사용하는 homebrew는 직접 설치해야 한다.
패키지는 라이브러리(library)와 유사한 개념이다.
라이브러리가 코드의 작성을 위해 사용되는 코드의 묶음이라면, 패키지는 코드의 배포를 위해 사용되는 코드의 묶음이다.
따라서 패키지는 경우에 따라 라이브러리를 포함할 수도 있으며, 일반적으로 라이브러리나 실행 파일(executable)을 포함한다.
패키지는 다음 3가지 정보를 가지고 있는 코드의 배포 단위이다.
1) 컴파일한 소프트웨어의 바이너리(binary)
2) 환경 설정(configuration)에 관련된 정보
3) 의존(dependency)에 관련된 정보
많은 패키지들은 다른 패키지가 설치되어 있어야만 제대로 동작한다.
이 경우에 기존 패키지를 제대로 동작시키기 위해 필요한 다른 패키지를 'dependency'라고 말한다.
따라서 패키지를 사용하고자 할 때 dependency에 해당되는 다른 패키지들을 전부 설치해줄 필요가 있다.
하지만 그런 새로운 패키지(dependency)들을 설치하는 도중 이번엔 설치하고 있는 패키지의 dependency를 설치해야 하는 상황이 발생할 수 있다.
즉, dependency의 dependency를 설치하는 경우가 생기며, 이런 상황이 끊임없이 이어질 경우 사용자가 수동으로 패키지를 관리하기가 불가능에 가까워진다. 이런 상황을 dependency hell이라고 한다🙀
따라서, 각각의 패키지가 자신의 dependency에 대한 정보를 가지게 한다면, 사용자가 사용하고자 하는 패키지의 dependency를 패키지 매니저를 통해 쉽게 설치하도록 도울 수 있다.
패키지 매니저는 운영체제와 프로그래밍 언어에서 사용되는 툴이다.
Node.js 환경에서는 NPM과 Yarn이 있는데, 취향 차이이지 둘 중에 어떤 것이 좋다 나쁘다의 문제는 아니다.
또한, Ubuntu 운영체제의 apt(Advanced Package Tool)가 대표적인 운영체제 패키지 매니저의 예다.
예를 들어 콘솔을 사용한 sudo apt-get install 명령어를 통해 패키지를 설치할 수 있다.
Python과 PHP, Node.js 등 많은 프로그래밍 언어들은 각각 자신만의 패키지 매니저와 software repository를 가지고 있다.
여러 종류의 패키지 매니저와 software repository를 가진 언어도 존재한다. (Node.js, Java, Ruby...)
부트캠프에서 교육 엔지니어님은 npm과 yarn을 취향의 차이라고 설명하셨다. 그런데, 다른 곳에서는 그 이상의 차이가 있다고 설명하는 곳도 있어서 둘의 차이를 확실하게 설명해줄 수 있는 분께 질문드렸다.
여기까지 패키지와 패키지 매니져 편 끝!!
이번 블로그는 " 코드스테이츠 "의 강의 내용의 일부를 참고하여 작성했으며, 그 어떠한 상업적 용도도 없음을 밝힙니다.