logo
Posts
패키지 매니저

패키지 매니저

패키지 매니저패키지를 다루는 작업을 편리하고 안전하게 수행하기 위해 사용되는 도구입니다. 여기서 패키지를 다룬다는 것은 패키지를 설치하거나 업데이트하고 삭제하는 등의 의존성을 관리하는 작업을 의미합니다.

더 자세히 알아보기 전에, 패키지의 정의에 대해서 알아보겠습니다.

패키지 (Package)

패키지는 소프트웨어 개발에서 재사용 가능코드 묶음을 의미합니다.
쉽게 말해, 패키지는 주로 특정 기능을 구현하거나 재사용할 수 있도록 준비된 모듈입니다.

📦

모듈은 프로그램을 구성하는 코드의 묶음을 의미합니다.

왜 패키지를 사용할까?

라이브러리를 사용하는 것만으로도 충분하지 않을까요? 왜 굳이 패키지를 사용할까요?

프로그램을 구현할 때 모든 코드를 하나의 파일에 작성한 경우를 상상해보세요. 몇 만 줄, 혹은 몇 십만 줄의 코드를 하나하나 읽는 것은 작성자라고 해도 매우 어려운 일입니다. 그런데 다른 사람이 코드를 이해하고 수정하는 것은 더 어려울 것입니다. 이렇게 되면 코드가 길어지고 복잡해지며, 유지보수가 어려워집니다. 또한 코드를 재사용하는 것은 거의 불가능에 가깝습니다.

이때 필요한 것이 모듈화 프로그래밍입니다. 코드가 재사용 가능하게 되면 유지보수가 쉬워지고, 다른 프로젝트에서도 같은 패키지를 활용할 수 있어 효율성이 높아집니다. 또한 모듈 단위로 코드를 분리함으로써 배포와 버전 관리도 훨씬 간편해집니다.

Node.js 에서는 위와 같은 이유로 모듈화 프로그래밍을 지원하며, 패키지를 통해 모듈을 관리할 수 있습니다.

잠시 궁금증이 들었을 수도 있습니다. 라이브러리패키지의 차이는 무엇일까요?

라이브러리와 패키지의 차이

라이브러리패키지는 비슷한 개념이지만, 약간의 차이가 있습니다.

라이브러리는 주로 특정 기능을 수행하는 코드 모음입니다.
개발자는 필요할 때, 라이브러리를 호출하여 그 기능을 사용할 수 있습니다.

패키지는 라이브러리를 포함할 수 있는, 더 포괄적인 개념입니다.
패키지는 단순하게 본다면 함수나 기능을 제공하는 코드라고 볼 수도 있습니다만, 더 나아가 실행 가능한 프로그램이나 애플리케이션, 혹은 다양한 의존성을 포함한 프로젝트 그 자체일 수도 있습니다. 즉, 라이브러리는 패키지의 일부분일 수 있습니다.

하지만 모든 라이브러리가 패키지로 배포되는 것은 아닙니다. 패키지는 메타데이터와 의존성 관리까지 포함하는 더 큰 단위로 이해할 수 있습니다.

위 내용을 간단하게 정리해보자면 다음과 같습니다.

  • 라이브러리: 특정 기능을 수행하는 코드 모음
  • 패키지: 라이브러리 뿐만 아니라, 다양한 구성요소(메타데이터, 의존성 관리 등)를 포함하는 더 큰 소프트웨어 단위

패키지 구성 요소

패키지는 다음 3가지 정보를 포함하는 소프트웨어 단위입니다.

  1. 바이너리(binary): 컴파일된 소프트웨어 또는 실행 가능한 코드가 포함될 수 있습니다. 일부 패키지는 컴파일된 형태로 제공되어 즉시 실행할 수 있는 바이너리를 포함하지만, JavaScript 패키지의 경우 바이너리를 포함하지 않고 소스 코드 자체로 배포되는 경우가 많습니다.
  2. 환경 설정(configuration): 패키지는 해당 프로그램이나 라이브러리를 실행하는 데 필요한 설정 정보를 포함합니다. 이 설정은 소프트웨어가 특정 환경에서 올바르게 동작할 수 있도록 정의됩니다.
  3. 의존성(dependency): 패키지가 정상적으로 동작하기 위해 필요한 다른 패키지나 라이브러리에 대한 정보가 포함됩니다. 의존성 관리 덕분에 패키지는 필요한 모든 종속 항목을 자동으로 설치하고 적절한 버전을 유지할 수 있습니다.

패키지 매니저의 역할

패키지 매니저는 다음과 같은 역할을 수행합니다.

  1. 패키지 설치: 패키지를 설치합니다. 패키지를 설치하면 해당 패키지의 바이너리, 환경 설정, 의존성 등이 자동으로 설치됩니다.
  2. 패키지 업데이트: 패키지를 업데이트합니다. 패키지의 새로운 버전이 나왔을 때, 패키지 매니저를 통해 업데이트할 수 있습니다.
  3. 패키지 삭제: 더 이상 필요하지 않은 패키지를 삭제합니다. 패키지를 삭제하면 해당 패키지의 바이너리, 환경 설정, 의존성 등이 자동으로 삭제됩니다.
  4. 의존성 관리: 패키지가 의존하는 다른 패키지를 자동으로 설치하고 관리합니다. 패키지를 설치할 때, 해당 패키지가 의존하는 다른 패키지가 있으면 자동으로 설치됩니다.
  5. 패키지 검색: 패키지를 검색하고 메타데이터를 조회합니다. 패키지 매니저를 통해 패키지를 검색하면 해당 패키지의 이름, 버전, 작성자, 의존성 정보, 사용 방법 등의 메타데이터를 확인할 수 있습니다.

패키지 매니저를 사용하면 패키지를 편리하게 설치하고 관리할 수 있으며, 의존성을 관리하는 데 도움이 됩니다.

의존성

의존성의 사전적 정의는 다음과 같습니다.
의존성(dependency) 은 소프트웨어 개발에서 다른 소프트웨어나 라이브러리에 의존하는 것을 의미합니다.

대부분의 패키지들은 다른 패키지가 설치되어 있어야만 정상적으로 동작합니다.
이러한 경우, 해당 패키지를 정상적으로 사용하기 위해 필요한 다른 패키지를 의존성(dependency) 이라고 합니다.

의존성은 패키지를 설치할 때 자동으로 설치되며, 패키지를 삭제할 때 자동으로 삭제됩니다. 의존성을 관리하는 것은 매우 중요합니다. 의존성을 관리하지 않으면, 프로그램이 정상적으로 동작하지 않을 수 있습니다.

의존성 관리의 중요성

의존성 관리는 소프트웨어 개발에서 매우 중요한 요소 중 하나입니다. 자칫 잘못된 의존성 관리는 디펜던시 헬과 같은 문제를 발생시킬 수 있습니다.

디펜던시 헬

디펜던시 헬은 소프트웨어 개발에서 의존성 관리가 복잡해지고 어려워지는 상황을 의미합니다. 이는 주로 다음과 같은 이유로 발생합니다.

  1. 의존성 충돌: 서로 다른 버전의 동일한 라이브러리를 필요로 하는 여러 패키지가 있을 때 발생합니다.
  2. 의존성 체인: 하나의 패키지가 여러 단계의 의존성을 가질 때, 각각의 단계에서 의존성 충돌이나 호환성 문제가 발생할 수 있습니다.
  3. 의존성 순환: 두 개 이상의 패키지가 서로를 의존할 때 발생하는 문제입니다.
  4. 의존성 업데이트: 의존성의 새로운 버전이 기존 코드와 호환되지 않을 때 발생합니다.

Node.js에서는 이러한 문제를 해결하기 위해 package.json 파일을 사용하여 의존성을 관리합니다. 또한, package-lock.json 또는 yarn.lock 파일을 통해 의존성의 버전을 고정할 수 있습니다. 이를 통해 패키지의 버전 충돌 문제를 최소화할 수 있습니다. 더 나아가, npm dedupe 명령어를 사용하거나 yarn workspaces 같은 도구를 통해 다중 패키지 간의 의존성을 더 체계적으로 관리할 수 있습니다.

운영 체제별 패키지 매니저

잠시 이전 글로 돌아가 봅시다.
Node.js 를 설치하는 방법 중, 운영 체제별로 다른 패키지 매니저를 사용하는 방법이 있었습니다.

일반적으로, 개발 도구들은 해당 운영체제에서 지원하는 패키지 매니저를 통해 설치하거나 관리할 수 있습니다.
대부분의 경우, 해당 운영 체제에서 설치 마법사보다 패키지 매니저를 사용하는 것이 더 편리하고 안전합니다. 패키지 매니저를 사용하면 환경 변수 설정, 의존성 관리, 버전 관리 등을 자동으로 처리해줍니다.

각 운영 체제별로 사용되는 패키지 매니저를 간단하게 알아보겠습니다.

Windows 운영 체제에서는 Chocolatey를 사용하여 패키지를 설치하거나 관리할 수 있습니다.
Chocolatey는 명령어 하나로 여러 개발 도구와 소프트웨어를 쉽게 설치할 수 있습니다. 특히, 개발 도구의 설치, 업데이트, 그리고 환경 변수 설정을 자동으로 처리해 주기 때문에 번거로움을 줄일 수 있습니다.

Node.js 의 패키지 매니저

Node.js 에도 Chocolatey, Homebrew, APT, YUM과 같은 패키지 매니저가 있습니다.
바로 npm (Node Package Manager) 입니다. npm 은 Node.js 의 표준 패키지 매니저로, Node.js 를 설치하면 함께 설치됩니다. npm 을 통해 Node.js 패키지를 설치하고 관리할 수 있습니다.

Node.js 는 본래 종속성을 다운로드하고 관리하는 데 사용되었지만, 현재는 대부분의 프론트엔드 JavaScript 프로젝트에 사용되는 주요 패키지 매니저로 성장했습니다.

yarn 및 pnpm

yarnpnpm 은 npm 의 대체 패키지 매니저입니다. 이들은 npm 보다 빠르고 효율적인 패키지 설치 및 관리를 제공합니다.

  • yarn: Facebook 에서 개발한 패키지 매니저로, npm 보다 빠르고 안정적인 패키지 설치를 제공합니다.
  • pnpm: npm 의 대안으로, npm 의 장점을 유지하면서도 더 빠른 패키지 설치를 제공합니다.

패키지 매니저에 대해 알아보았습니다.
다음 글에서는 package.json 에 대해 자세히 알아보겠습니다.