[F-Lab 모각코 챌린지 52일차] Package Manager 패키지 매니저, (js)

Nami·2023년 7월 22일
1

66일 포스팅 챌린지

목록 보기
52/66
패키지 매니저를 쓰고 있음에도 무슨 일을 하는 건지 모르고 있었다. js 프로젝트 컨셉도 정하고 들어가게되면 어떤 패키지 매니저가 좋을지에 대해 고려하면서 깊게 공부해보려한다.

Package Manager 패키지 매니저

(패키지 관리 시스템)

컴퓨터의 운영 체제를 위해 일정한 방식으로 컴퓨터 프로그램의 설치, 업그레이드, 구성, 제거 과정을 자동화하는 소프트웨어 도구들의 모임이다. 패키지 관리자는 아카이브 파일로된 소프트웨어 배포판과 데이터인 패키지(package)를 다룬다.

  • 패키지 설치, 업데이트, 삭제
  • 의존성 dependency 관리
  • 패키지 압축 해제
  • 패키지 검색
  • 환경 설정
  • 보안 관리 : 신뢰할 수 있고(authenticity), 손상되지 않음(integrity)을 보장

Package?

Package는 소프트웨어나 프로그램 등의 실행 가능한 코드와 관련된 모든 파일들을 포함하는 하나의 단위를 말한다. 이런 파일들은 서로 연관되어 있어서 하나의 기능이나 작업을 수행하기 위해 필요한 모든 자원들이 함께 묶여 있는 형태로 제공된다. 쉽게 설명하면 배포를 위해 사용되는 코드의 묶음

  1. 컴파일한 소프트웨어의 바이너리(Binary)
    • 컴파일된 소프트웨어의 실행 가능한 바이너리 파일
    • 컴퓨터에서 직접 실행할 수 있는 실행 파일
  2. 환경 설정(Configuration)에 관련된 정보
    • 소프트웨어가 올바르게 동작하기 위해 필요한 구성 파일
  3. 의존 Dependency에 관련된 정보
    • 다른 패키지들과의 종속 관계

Package를 어디서 들고 올까?

패키지 매니저의 온라인 소프트웨어 저장소software repository(repos) 혹은 레지스트리registry라고도 불림.
software repository에서 패키지를 가져온다. 인터넷상에 호스팅되어 있고 다양한 패키지들과 그에 대한 메타데이터(패키지 정보)가 저장되어 있다. 대표적으로 JavaScript 프로젝트의 경우, NPM과 Yarn이 사용되는데, NPM 레지스트리와 Yarn 레지스트리라는 온라인 저장소에서 패키지를 가져온다.
즉, 레지스트리 안에 패키지가 있다. 레지스트리는 특정 프로그래밍 언어 또는 프로젝트 환경에 맞춰서 패키지들을 관리하고 배포하는 중앙 집중식 저장소이다.

  • 커뮤니티에 기여하는 것을 목적으로 다른 사용자들을 위해 패키지를 등록할 수도 있다.
  • 성능 문제(load balancing)와 위기상황 대처(fault tolerant)를 위해 여러 개로 분리되어있으며, 각각의 저장소가 동일한 기능을 수행한다.
  • Software repository에 대한 위치 정보를 관리하는 환경 설정 파일이 존재하므로, 그 경로를 참고하여 software repository에 접근하는 방식을 사용한다.

묶음은 어떤 기준으로 정해지지?

일반적으로 프로그래밍 언어 또는 개발 환경에 따라 정해짐. 패키지 매니저가 이를 관리한다.
패키지 매니저들은 특정 규칙과 규약을 따라 패키지를 생성하고 관리한다.
JavaScript 기준으로 root 디렉토리에 package.json파일을 사용한다. 패키지 매니저가 이 파일을 참조하여 프로젝트에 필요한 패키지를 설치하고 관리한다.

오 완전 흥미롭다. package.json이 패키지 단위를 제시하는거나 다름없구나!

package.json이 하는 일?

package.json파일은 프로젝트 정보와 의존성(dependencies)을 관리하는 문서이다.
아래는 npm 공식 문서에 나온 설명이다.

다른 사람들이 쉽게 관리하고 설치할 수 있도록 패키지에 package.json파일을 추가할 수 있고, 레지스트리에 게시된 패키지는 package.json파일을 포함해야 한다!

  • 프로젝트가 의존하는 패키지 리스트
  • semantic versioning rules를 사용하여 프로젝트에서 사용할 수 있는 패키지 버전을 지정한다.
    (프로젝트 버전을 명시)
  • 다른 환경에서도 빌드를 재생가능하게 만들어 다른 개발자가 쉽게 사용할 수 있도록 한다.

오픈소스 패키지 생태계를 사용하기 위한 명세이자, 프로젝트의 의존성 관리를 위한 명세, 또 이 생태계로의 배포를 위한 명세라고 볼 수 있다.

글을 참조한 개발자분이 스스로 정의하신 부분인데 너무 적절한 말 같아서 들고왔다.

package.json 구성요소는 정말 많아서 나중에 따로 정리해야겠다.

의존성 dependency?

의존성 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

  • Facebook에서 개발한 JavaScript 패키지 매니저
  • NPM과 유사한 기능을 제공
  • NPM보다 더 빠른 패키지 설치 속도와 의존성 관리를 제공
  • .yarnrc 파일을 통해 각종 설정을 관리
  • yarn.lock 파일을 통해 패키지의 버전 정보를 관리한다.
  • 대규모 프로젝트에서 유용하게 사용

yarn berry

  • yarn berry는 Yarn의 2 이상의 버전을 일컫는 말이다.
  • 이전 버전과 구조가 많이 다르다!
  • monorepo 구조나 플러그인 매커니즘을 강화했다.
  • 대규모 프로젝트에서 유용하며, 자체적으로 플러그인과 통합된 매커니즘을 갖고 있다.

pnpm

  • pnpm은 Yarn과 NPM과 다른 접근 방식을 가진 JavaScript 패키지 매니저
    • Yarn과 NPM은 패키지를 설치할 때 각각의 프로젝트마다 패키지를 복사하여 저장하는데, 이로 인해 디스크 공간을 많이 차지할 수 있다. 반면 pnpm은 하나의 공유 패키지 저장소를 사용하여 모든 프로젝트에서 패키지를 공유하고, 하드 링크를 통해 중복을 피한다.
  • 설치 속도가 빠르며, 패키지 설치를 효율적으로 처리한다.
  • 디스크 공간을 효율적으로 관리하고자 하는 경우에 유용하다.
  • 때문에 작은 프로젝트부터 대규모 프로젝트까지 사용 가능하다.

프로젝트에 어떤 게 좋을지는 개발자들의 케이스를 많이 접해보아야겠다.


참조 ✅

6개의 댓글

comment-user-thumbnail
2023년 7월 22일

우와 프알못 백엔드가 봐도 정말 정리 잘하셨네요!

1개의 답글
comment-user-thumbnail
2023년 7월 22일

좋은 글 감사합니다. 발도장 쾅 찍고 가요..^^..☆

1개의 답글
comment-user-thumbnail
2023년 7월 22일

좋은 자료 공유 감사합니다.

1개의 답글