Nodejs

패키지 매니저 - Yarn

Seongmin 2024. 12. 15. 14:35
반응형

Yarn이란?

Yarn은 JavaScript 생태계에서 널리 사용되는 패키지 매니저로, Facebook에서 2016년에 처음 발표되었습니다. 패키지 매니저는 프로젝트에서 필요한 외부 라이브러리를 설치하고 관리하며, 종속성과 버전을 효율적으로 처리해주는 도구입니다. Yarn은 npm(Node Package Manager)의 한계를 보완하기 위해 등장했으며, 빠른 속도와 안정성을 목표로 개발되었습니다.

Yarn의 등장 배경

2016년 당시, npm은 JavaScript 개발의 표준 패키지 매니저로 자리 잡았지만, 몇 가지 단점이 지적되었습니다:

  1. 속도 문제: npm은 설치 속도가 느리고, 동일한 패키지를 다시 설치할 때도 많은 시간이 소요되었습니다.
  2. 종속성 관리의 불안정성: npm의 종속성 트리가 복잡해질수록 충돌과 예측 불가능한 동작이 자주 발생했습니다.
  3. 결정론적 설치의 부재: 동일한 종속성 파일을 사용해도 환경에 따라 서로 다른 결과를 초래할 가능성이 있었습니다.

Yarn은 이러한 문제를 해결하기 위해 설계되었으며, 특히 성능과 신뢰성에서 강력한 개선을 이루었습니다.

Yarn의 주요 특징

  1. 빠른 설치 속도: Yarn은 패키지 다운로드 시 병렬 처리를 사용하여 npm보다 훨씬 빠른 설치 속도를 자랑합니다. 기존 npm이 직렬 방식으로 하나씩 패키지를 다운로드하던 방식과 달리, Yarn은 여러 패키지를 동시에 다운로드합니다. 또한 다운로드한 패키지를 캐시에 저장하여, 재설치 시 네트워크 호출 없이 캐시된 패키지를 사용하므로 설치 속도가 크게 향상됩니다.
  2. 결정론적 설치: Yarn은 yarn.lock 파일을 통해 종속성의 정확한 버전 정보를 기록합니다. 이를 통해 팀원이나 CI/CD 환경에서 동일한 패키지 트리를 일관되게 재현할 수 있습니다. Yarn은 설치 과정에서 yarn.lock 파일을 더 엄격하게 적용하며, 모든 종속성을 명시적으로 잠급니다. 반면 npm은 경우에 따라 유연한 버전 설치를 허용해 종속성 트리에 미세한 차이가 발생할 가능성이 있습니다
    • npm:
      • ^(caret)나 ~(tilde)와 같은 버전 범위가 명시된 경우, 하위 의존성의 업데이트를 허용.
      • 예를 들어, ^1.2.0은 1.2.x 버전을 허용하지만, 마이너 업데이트(1.3.0)는 허용하지 않음.
      • 이로 인해 의존성 트리에 미세한 차이가 발생할 가능성이 있음.
    • yarn:
      • yarn.lock에 고정된 버전 외의 다른 버전이 설치되지 않음.
      • 예: ^1.2.0으로 정의되어도, yarn.lock에 기록된 1.2.3 버전만 설치.
  3. Workspace 지원: 다중 프로젝트를 하나의 저장소에서 효율적으로 관리할 수 있는 모노레포(Monorepo)를 기본적으로 지원합니다.
  4. 플러그인 시스템: Yarn Berry(2.x 이상)부터 도입된 기능으로, 플러그인을 통해 Yarn의 기능을 확장할 수 있으며, 프로젝트의 요구사항에 맞게 맞춤 설정이 가능합니다.
  5. Plug’n’Play(PnP): Yarn Berry(2.x 이상)부터 도입된 기능으로, Node.js 생태계에서 흔히 사용하는 node_modules 폴더를 제거하고, 종속성을 효율적으로 관리하는 새로운 접근 방식을 도입했습니다. 이는 디스크 공간 절약과 종속성 로딩 성능 개선을 가능하게 합니다.

Yarn의 발전 과정

Yarn은 처음 발표된 이후 꾸준히 발전해 왔습니다. Yarn은 처음 발표된 2016년에는 "Yarn Classic"이라는 명칭 없이 단순히 Yarn으로 불렸습니다. 러나 2020년에 Yarn 2.x(코드명 Berry)가 발표되면서 기존 1.x 버전은 "Yarn Classic"이라는 이름으로 구분되기 시작했습니다.

  • Yarn Classic (1.x): 초기 버전으로, 기존 npm의 패키지 관리 방식을 개선하며 빠르게 널리 사용되었습니다.
  • Yarn Berry (2.x 이상): 2020년에 발표된 Yarn 2.0(코드명 Berry)은 근본적인 변화와 함께 더 강력한 기능을 추가했습니다. 특히 Plug’n’Play, Zero-Install, 플러그인 시스템 등의 혁신적인 기능이 도입되었습니다.
  • Yarn 3.x, 4.x: 지속적인 성능 최적화와 새로운 도구를 통해 개발자 경험을 향상시키고, 최신 JavaScript 생태계의 요구를 충족시키고 있습니다.

Yarn 설치

  • npm을 이용한 설치
npm install -g yarn

 

  • brew를 이용한 설치 (brew 설치 필요)
brew install yarn
  • corepack을 이용한 설치 (Node.js 16.10 이상)
corepack enable

# corepack prepare yarn@<버전> --activate
corepack prepare yarn@stable --activate

 

Yarn으로 프로젝트 시작하기

Yarn을 사용해 새로운 프로젝트를 시작하는 방법은 매우 간단합니다. 아래는 Yarn을 통해 프로젝트를 초기화하고 패키지를 설치하는 기본적인 예제입니다.

# Yarn 초기화
yarn init -y

# 패키지 설치
yarn add [패키지명]

# 개발 의존성 설치
yarn add [패키지명] -D

# 프로젝트 실행 스크립트 실행
yarn [스크립트명]

 

대부분의 명령어가 버전과 상관없이 동일하지만 글로벌 패키지를 다루는 방식이 달라졌다. 기존에는 로컬 패키지, 글로벌 패키지, 일회성 패키지 모두 npx를 사용했지만 Yarn berry에서는 로컬 패키지, 글로벌 패키지를 다루는 방법과 일회성 패키지를 다루는 방법이 나누어졌다.

# yarn classic
# 로컬 패키지 탐색 -> 글로벌 패키지 탐색 -> 없으면 설치 후 실행
npx [패키지명]

# yarn berry
# 로컬 패키지 탐색 -> 글로벌 패키지 탐색
yarn [패키지명]
# 일회성 패키지
yarn dlx [패키지명]

 

Yarn Berry 사용하기

현재 버전이 Classic인데 Berry를 사용하려면 init 후 version을 berry로 설정하면 된다.

yarn init -y

# 현재 버전을 확인해본다.
yarn --version

# berry로 변경한다.
yarn set version berry

# 다시 버전을 확인해본다.
yarn --version

 

VS Code에서 Yarn Berry 사용하기

Yarn Berry를 사용할 때 VS Code와의 호환성을 위해 몇 가지 추가 설정이 필요합니다. 특히 Yarn Berry는 Plug’n’Play(PnP)를 기본 설정으로 사용하므로, 이를 지원하기 위해 VS Code 환경에서 설정을 조정해야 합니다.

  • Yarn SDK 추가 프로젝트 루트 디렉토리에서 다음 명령을 실행하여 VS Code용 SDK를 추가합니다:이 명령은 프로젝트에 필요한 VS Code 설정 파일을 생성하고, TypeScript 및 JavaScript IntelliSense를 활성화합니다.
yarn dlx @yarnpkg/sdks vscode

 

  • VS Code 설정 파일 생성 위 명령을 실행하면 .vscode/settings.json 파일이 생성됩니다. 이 파일은 Yarn PnP를 사용하는 프로젝트에서 올바르게 작동하도록 VS Code를 구성합니다.

 

Zero-Install에 대하여...

Yarn Berry의 또 다른 주요 특징은 Zero-Install입니다. 이 방식은 의존성을 형상 관리에 포함시켜 관리하는 방법으로, 팀원 간의 의존성 차이를 방지하고 CI/CD 과정에서 의존성을 다시 설치하지 않아도 되는 장점이 있습니다. 기존에는 의존성 자체가 용량을 많이 차지하기 때문에 형상 관리에서 제외했지만, Yarn Berry에서는 의존성을 압축해 관리하여 용량을 크게 줄였습니다. 다만, 의존성을 포함하지 않는 기존 방식보다 많은 용량을 차지하는 단점이 있으므로, 이 기능은 프로젝트의 요구사항에 따라 선택적으로 사용하는 것이 좋습니다. 이 기능을 활성화하는 특별한 명령어는 필요하지 않으며, 단순히 .yarn 폴더를 형상 관리에 포함시키면 됩니다.

반응형