패키지 매니저의 정의는 일반적으로 다음과 같다.
package manager는 컴퓨터의 운영 체제를 위해 일정한 방식으로 컴퓨터 프로그램의 설치, 업그레이드, 구성, 제거 과정을 자동화하는 소프트웨어 도구들의 모임이다. - wikipedia
패키지(package)는 라이브러리와 비슷한 개념인데, 라이브러리는 특정한 기능을 위해서 미리 만들어둔 코드의 집합이다. 패키지는 이러한 라이브러리를 다른 사람들이 쓸 수 있게끔 잘 포장되어 있는 형식이다.
npmjs.com 사이트에 접속하면, 위 내용을 볼 수 있다. npm은 node.js 환경에서 작동하는 패키지들을 다룰 수 있게 도와준다. npm 명령어를 사용하면 npmjs라는 software repository에서 패키지 소스를 가져올 수 있다. 해당 사이트에는 다양한 사람들이 node로 만들어진 코드를 오픈소스로 패키지화하여 올려두었다. 누구나 오픈소스로 패키지를 만들어 공유할 수 있으며, 개발하는 도중에 필요한 패키지를 찾아서 사용할 수도 있다.
패키지 매니저(package manager)는 편리하게 패키지들을 관리할 수 있게 도와주는데, 환경 설정 정보나 의존성에 대한 정보도 포함하여 더욱 편리하게 패키지들을 관리할 수 있게 도와준다. 여기서 의존성(dependency)은 어떤 패키지를 동작하기 위해서 필수적으로 필요한 다른 패키지들을 뜻한다.
개발자가 직접 모든 의존성을 다루기에는 시간과 노력이 많이 필요하기 때문에 패키지 매니저가 직접 의존성을 관리해주게 된다. node 계열의 패키지 매니저는 npm, yarn, pnpm, bun 등 다양한 패키지 매니저가 있다. python 계열에는 pip라는 패키지 매니저가 있다.
apt(ubuntu) 및 homebrew(MacOS)처럼 운영체제 레벨에서 사용하는 패키지 매니저도 있고, npm 및 pip처럼 특정 언어를 다루는 패키지 매니저들이 있다. 이러한 패키지 매니저들을 언제 어떻게 쓰는지, 글의 후반부에 중점적으로 다루도록 한다.
본론
OS 레벨에서 사용하는 패키지 매니저
자, 맨 처음 운영체제를 실행시킨다고 생각하자. 예를 들어 ubuntu 20.04 버전을 사용한다고 생각해보자. 그렇다고 한다면 실행할 수 있는 동작은 얼마 되질 않는다. 운영체제를 처음 동작시켰다고 하면, 내장되어 있는 명령어 밖에 쓸 수 없기 때문이다.
ubuntu에서는 패키지 매니저로 apt ( Advanced Package Tool )를 기본으로 사용한다. CLI를 통해서 우분투에 다양한 프로그램을 설치하기 위해서는 apt라는 패키지 매니저를 통해 설치해야 한다. 주요 명령어는 다음과 같다. (★ : 관리자 권한 필요)
- apt update : 패키지를 다운로드할 수 있는 저장소의 최신 정보를 업데이트 (★)
- apt updrade : 패키지를 전체 업데이트 한다. (★)
- apt install PACKAGE : PACKAGE 다운로드한다. (★)
- apt list --installed : 설치된 패키지 목록을 출력
- apt search PACKAGE : PACKAGE를 검색한다.
- apt remove PACKAGE : PACKAGE를 삭제한다. (★)
이 중 일부의 apt 명령어는 관리자 권한이 필요하기 때문에 sudo를 앞에 붙여서 명령어를 실행할 수 있다.
sudo apt install node
이런 식으로 ubuntu에서는 apt라는 패키지 매니저를 통해 다양한 패키지들을 설치할 수 있다. 다양한 패키지들이 apt를 통한 다운로드를 지원하기 때문에 구글링을 하면 설치 방법을 찾을 수 있다.
Application 레벨에서 사용하는 패키지 매니저
소프트웨어 레벨에서 사용하는 패키지 매니저는 npm, pip, gradle 같은 것들을 뜻한다. 프로그래밍 언어마다 사용하는 패키지 매니저들은 다음과 같은 것들이 있다.
- node : npm, yarn, pnpm
- java : maven, gradle
- python : pip, conda
다음과 같은 패키지 매니저를 통해 다양한 라이브러리를 가져다 쓸 수 있다. python을 예로 들면 pip(Python Package Index)는 파이썬의 기본 패키지 관리자로, pypi.org라는 software repository에서 다양한 패키지를 끌어 온다. 데이터 분석 분야에서 사용하는 numpy 및 pandas를 설치하려면 어떻게 해야 할까? 아마도 다음 명령어를 통해서 설치할 수 있을 것이다.
# numpy
pip install numpy
# pandas
pip install pandas
단, pip가 설치되어있다는 가정하에 가능할 것이다. pip가 없다면 pip를 먼저 설치한 후 위 명령어를 통해 패키지를 설치할 수 있게 된다. ubuntu 20.04 버전에서 pip가 없다면 다음 명령어를 먼저 실행해야 할 것이다.
sudo apt install python-pip
ubuntu 시작부터 node 실행까지
기본적인 패키지 매니저에 대한 설명이 끝났다. 이제 ubuntu 20.04 버전에 기본적인 세팅을 통해서 어떻게 애플리케이션을 실행시킬 수 있는지 알아보자. 다음과 같은 상황이다.
github 레포지토리에 올라와있는 nestjs 프레임워크로 쓰인 소스 코드의 실행
ubuntu OS에 cli를 통해서 접근한다. AWS에서 ubuntu 20.04 버전의 인스턴스에 SSH로 접근했다. ubuntu에서는 앞서 말했듯이 apt를 사용한다. 따라서 apt를 통해서 기본적으로 필요한 다른 패키지들을 설치해야 한다. ( git, node, npm... )
# 패키지 매니저 업데이트
sudo apt update
# git 설치
sudo apt install git
# git 버전 확인
git --version
이러한 명령어를 통해서 git을 먼저 다운받았다. 이제 github에 올라와있는 프로젝트를 실행하기 위해서는 어떻게 해야 할까? 예를 들어 node 프로젝트를 실행하는 경우를 생각해 보자. git은 깔려 있으니 git clone을 통해서 github에 있는 내용을 가져올 수 있게 되었다.
npm을 사용하는 프레임워크를 clone해 온 다음 npm run start 명령어를 치면 npm이 없다고 나온다. 다음 명령어를 통해서 npm을 설치할 수 있다.
sudo apt install npm
다음 명령어를 치면 굉장히 많은 패키지들을 깔게 된다. 이때, 터미널 창에 의존성이 있다고 하는 것을 볼 수 있는데, 다 같이 설치하겠냐고 묻는 페이지가 뜬다. yes를 선택하여 한 번에 설치하면 npm을 포함한 다양한 의존성(dependency)이 걸려 있는 패키지 또한 같이 설치된다.
자 이제 npm run start 명령어를 통해서 프레임워크를 실행시키면 정상적으로 작동할까? 아쉽게도 아직 조금 더 남았다. apt라는 우분투의 패키지 매니저를 통해서 node 및 npm을 설치했다. 운영체제는 자바스크립트 및 타입스크립트로 쓰여진 언어를 빌드 및 실행할 수 있는 기본은 갖추었지만, 애플리케이션 레벨에서는 실행시킬 수 있는 패키지를 아직 설치하지 않았다. 다음 명령어를 통해서 node에서 사용하는 패키지들을 설치할 수 있다.
npm install
npm은 디렉토리에 있는 package.json 파일을 읽어 들여 애플리케이션 실행에 필요한 패키지들을 한 번에 설치한다. 해당 프로젝트(LOL-crawler)는 NestJS라는 프레임워크를 쓰기 때문에 NestJS의 패키지들과 개인적으로 가져다 쓴 패키지들이 함께 설치되게 된다.
npm install 명령어를 통해 다양한 의존성을 설치하면 이제 어플리케이션의 실행에 필요한 모든 의존성이 갖춰지게 된다. 이렇게 OS 레벨 및 Application 레벨의 패키지 매니저들을 통해 다양한 패키지들을 설치하여, 프로그램을 실행할 수 있게 된다.
참조
- 리눅스의 apt 명령어 정리 : https://ittrue.tistory.com/82
- 패키지 관리자 ( 위키피디아 ) : https://ko.wikipedia.org/wiki/패키지_관리자
'CS > OS' 카테고리의 다른 글
환경 변수(environment variable) 에 대해서 (2) | 2023.09.16 |
---|