(패키지 관리 시스템)
컴퓨터의 운영 체제를 위해 일정한 방식으로 컴퓨터 프로그램의 설치, 업그레이드, 구성, 제거 과정을 자동화하는 소프트웨어 도구들의 모임이다. 패키지 관리자는 아카이브 파일로된 소프트웨어 배포판과 데이터인 패키지(package)를 다룬다.
Package는 소프트웨어나 프로그램 등의 실행 가능한 코드와 관련된 모든 파일들을 포함하는 하나의 단위를 말한다. 이런 파일들은 서로 연관되어 있어서 하나의 기능이나 작업을 수행하기 위해 필요한 모든 자원들이 함께 묶여 있는 형태로 제공된다. 쉽게 설명하면 배포를 위해 사용되는 코드의 묶음
패키지 매니저의 온라인 소프트웨어 저장소software repository(repos) 혹은 레지스트리registry라고도 불림.
software repository에서 패키지를 가져온다. 인터넷상에 호스팅되어 있고 다양한 패키지들과 그에 대한 메타데이터(패키지 정보)가 저장되어 있다. 대표적으로 JavaScript 프로젝트의 경우, NPM과 Yarn이 사용되는데, NPM 레지스트리와 Yarn 레지스트리라는 온라인 저장소에서 패키지를 가져온다.
즉, 레지스트리 안에 패키지가 있다. 레지스트리는 특정 프로그래밍 언어 또는 프로젝트 환경에 맞춰서 패키지들을 관리하고 배포하는 중앙 집중식 저장소이다.
일반적으로 프로그래밍 언어 또는 개발 환경에 따라 정해짐. 패키지 매니저가 이를 관리한다.
패키지 매니저들은 특정 규칙과 규약을 따라 패키지를 생성하고 관리한다.
JavaScript 기준으로 root 디렉토리에 package.json
파일을 사용한다. 패키지 매니저가 이 파일을 참조하여 프로젝트에 필요한 패키지를 설치하고 관리한다.
오 완전 흥미롭다. package.json이 패키지 단위를 제시하는거나 다름없구나!
package.json
이 하는 일?package.json
파일은 프로젝트 정보와 의존성(dependencies)을 관리하는 문서이다.
아래는 npm 공식 문서에 나온 설명이다.
다른 사람들이 쉽게 관리하고 설치할 수 있도록 패키지에 package.json
파일을 추가할 수 있고, 레지스트리에 게시된 패키지는 package.json
파일을 포함해야 한다!
오픈소스 패키지 생태계를 사용하기 위한 명세이자, 프로젝트의 의존성 관리를 위한 명세, 또 이 생태계로의 배포를 위한 명세라고 볼 수 있다.
글을 참조한 개발자분이 스스로 정의하신 부분인데 너무 적절한 말 같아서 들고왔다.
package.json 구성요소는 정말 많아서 나중에 따로 정리해야겠다.
의존성 Dependency 혹은 종속성은 정말 자주 듣고 본 단어지만 정확하게 제대로 짚고 넘어가자!
한 소프트웨어가 다른 소프트웨어에 의존하는 경우를 가리키는 광범위한 소프트웨어 엔지니어링 용어이다.
예를 들어, JavaScript 프로젝트에서 프로젝트 A가 프로젝트 B의 함수를 사용하려면 A는 B에 대한 의존성이 있다고 말한다.
애플리케이션이 복잡해질수록 의존성은 피할 수 없는 과제인 듯하다. 그렇기에 이걸 어떻게 잘 컨트롤할지 고민하는게 개발자의 몫인듯하다. 의존성과 관련된 글 중 흥미로운 부분을 들고왔다.
What are Dependencies in Programming
Why we use Dependencies
우리는 이미 시도되고 테스트된 것을 수행한 다음 그 위에 추가로 구축합니다. 테스트된 코드를 사용하여 시간을 절약한 다음 절약한 시간을 사용하여 새롭고 더 나은 것을 만듭니다.
Python이 인기 있는 주요 이유 중 하나입니다. 다양한 시나리오를 위해 미리 작성된 코드가 포함된 Python 라이브러리가 너무 많아 새로운 프로그래머가 이러한 라이브러리를 사용하여 몇 주 내에 복잡한 고급 응용 프로그램을 빌드할 수 있습니다.
의존성은 일반적으로 두 가지의 경우에 나타난다.
컴파일 타임 의존성(Compile-time Dependency)
프로그램을 컴파일하는 단계에서 발생하는 의존성.
(C, C++, Java, Kotlin)
컴파일러는 해당 컴포넌트가 다른 모듈의 함수 또는 변수를 사용하고 있다면, 이를 찾아서 해당 모듈과의 의존성을 설정한다. 주로 정적 타입 언어에서 나타나며, 컴파일 타임에 의존성이 결정되므로 컴파일러가 해당 의존성을 검사하고 오류를 발생시킬 수 있다.
런타임 시에는 추가적인 의존성 로딩이 필요하지 않아서 애플리케이션의 시작 속도가 빠르고, 보다 안정적인 코드를 제공할 수 있다.
런타임 의존성(Runtime Dependency)
프로그램이 실행되는 동안 동적으로 발생하는 의존성.
(JavaScript, Python, Ruby, PHP)
런타임 의존성은 프로그램이 실행되는 도중에 프로그램 내부에서 또는 외부에서 다른 모듈이나 라이브러리를 호출하거나 사용할 때 발생한다. 주로 동적 타입 언어에서 나타나며, 런타임에 의존성이 결정되므로 실행 중에 의존성 오류가 발생할 수 있다.
애플리케이션이 실행 중에 필요한 모듈을 동적으로 로드하여 사용한다. 유연성을 제공하며 애플리케이션의 크기를 줄일 수 있다! 하지만 런타임에 의존성이 해결되기 때문에 의존성 오류가 발생할 수 있으며, 애플리케이션 실행 시에 의존성 로딩으로 인해 시작 속도가 상대적으로 느릴 수 있다.
의존성도 정적이냐 동적이냐에 따라 발생하는 부분이 다르구나. 생각해보니 그렇네. 재밌다..!.!
yarn
, yarn berry
, pnpm
,세가지 모두 Javascript 프로젝트에서 사용되는 패키지 매니저이다. 각각의 차이점을 알아보자!
yarn
yarn berry
pnpm
프로젝트에 어떤 게 좋을지는 개발자들의 케이스를 많이 접해보아야겠다.
우와 프알못 백엔드가 봐도 정말 정리 잘하셨네요!