yarn — Node.js를 위한 대체 패키지 매니저로, 2016년 Facebook이 Exponent, Google 및 Tilde와 공동으로 만들었습니다. yarn은 npm 2-4의 속도 및 보안 문제를 해결했습니다: 병렬 설치, 엄격한 lock 파일 및 오프라인 캐시. 오늘날 yarn은 React Native, Expo 및 모노레포에서 여전히 인기가 있습니다. 자세한 내용은 yarn Documentation에서 확인하세요.
핵심 포인트
yarn(Yet Another Resource Negotiator)은 2016년 10월 npm 2-4의 문제(느린 설치, lock 파일 부족, 안전하지 않은 패키지)에 대한 Facebook의 대응으로 출시되었습니다. yarn은 병렬 패키지 다운로드, 결정론적 yarn.lock 및 체크섬을 통한 무결성 검증을 도입했습니다. 2020년 yarn은 Plug'n'Play 및 TypeScript-first 접근 방식으로 버전 2(Berry)로 전환했습니다.
yarn 아키텍처는 npm과 다릅니다: yarn은 패키지를 병렬로 다운로드하고(npm은 버전 5 이전에는 순차적으로), 각 패키지를 ~/.cache/yarn에 프로젝트 간 중복 없이 캐시하며, 체크섬을 통해 무결성을 검증합니다. yarn은 모든 설치 시 yarn.lock을 생성하는 반면, npm의 package-lock.json은 버전 5에서야 등장했습니다.
yarn 2(Berry, 2020)부터 yarn은 완전히 TypeScript로 다시 작성되었으며 Plug'n'Play, workspaces, 모노레포용 constraints 및 다양한 소스(npm, git, tarball)에서의 설치 프로토콜을 지원합니다. yarn 3+(2022)는 Zero-Installs를 추가했습니다 — 네트워크 없이 즉시 설치할 수 있도록 리포지토리에 캐시를 저장합니다.
yarn install — package.json과 yarn.lock을 읽고 종속성을 설치하는 주요 명령어입니다. yarn은 패키지를 병렬로 다운로드하여 npm 4 및 이전 버전과 비교해 설치 속도를 2~3배 향상시킵니다. yarn은 오프라인 캐시를 사용합니다: 패키지가 다른 프로젝트에서 이미 다운로드된 경우 다시 다운로드하지 않고 캐시에서 복사됩니다.
# yarn 기본 명령어
$ yarn install
$ yarn add react-native-webview
$ yarn add --dev typescript
$ yarn global add expo-cli
# 대화형 업데이트
$ yarn upgrade-interactive
# 중복 패키지 제거
$ yarn dedupe
yarn add — 새 패키지를 설치하는 명령어입니다. yarn add <package>는 dependencies에 추가하고, yarn add --dev는 devDependencies에 추가합니다. yarn은 자동으로 yarn.lock을 업데이트합니다. yarn upgrade는 시맨틱 범위 내에서 패키지를 최신 버전으로 업데이트합니다. yarn upgrade-interactive — 업데이트할 특정 패키지를 선택하는 대화형 모드입니다.
yarn cache — ~/.cache/yarn/v6에 있는 글로벌 캐시입니다. 각 패키지는 체크섬과 함께 ZIP 아카이브에 한 번 저장됩니다. yarn 캐시는 자동으로 정리되지만 수동으로 yarn cache clean을 실행할 수 있습니다. yarn cache dir은 캐시 경로를 표시합니다. yarn cache list — 캐시된 패키지 목록입니다.
yarn.lock — 모든 종속성 및 그 전이 패키지의 정확한 버전을 기록하는 lock 파일입니다. package-lock.json(JSON)과 달리 yarn.lock은 플랫 구조의 YAML 형식을 사용합니다. yarn.lock은 yarn install 또는 yarn add 시 항상 자동 생성됩니다 — 이로써 모든 개발자와 CI 서버가 동일한 패키지 세트를 받을 수 있습니다.
# yarn.lock 구조 예제
react@^18.3.0:
version: "18.3.1"
resolution: "react@npm:18.3.1"
dependencies:
loose-envify: "^1.1.0"
checksum: "abc123def456..."
react-native@^0.76.0:
version: "0.76.3"
resolution: "react-native@npm:0.76.3"
dependencies:
react: "18.3.1"
checksum: "def789ghi012..."
yarn.lock 필드: version — 정확한 패키지 버전, resolution — 소스 및 버전, dependencies — 해당 종속성, checksum — 검증을 위한 체크섬. yarn.lock은 리포지토리에 커밋되며 종속성의 유일한 정보 소스입니다. yarn.lock과 package.json이 일치하지 않으면 yarn이 경고를 표시합니다.
Yarn constraints — yarn.lock에서 종속성 버전을 확인하고 강제하는 모노레포용 규칙 시스템입니다. 제약 조건은 Yarn Constraint Language를 사용하여 yarn.constraints.js 파일에 설명됩니다. Constraints를 사용하면 모노레포의 모든 패키지가 동일한 버전의 React 또는 TypeScript를 사용하도록 보장할 수 있습니다.
React Native는 전통적으로 yarn과 밀접하게 연결되어 왔습니다. Expo CLI, React Native CLI 및 Create React Native App은 초기에 yarn을 사용했습니다. React Native 프로젝트에서 yarn.lock은 네이티브 모듈의 버전을 고정하며, 이는 CocoaPods(iOS) 및 Gradle(Android)을 통한 안정적인 컴파일에 매우 중요합니다. 공유 코드가 있는 React Native 모노레포에서 yarn workspaces가 인기가 있습니다.
React Native 모노레포의 yarn workspaces: 루트 package.json에 "workspaces": ["packages/*", "mobile"]이 포함됩니다. yarn install은 루트 수준에 단일 node_modules 폴더를 만듭니다. 패키지는 심링크를 통해 서로를 참조합니다. 네이티브 종속성을 변경한 후 CocoaPods를 업데이트하기 위해 npx pod-install이 실행됩니다.
{
"private": true,
"workspaces": [
"packages/*",
"apps/mobile",
"apps/web"
],
"scripts": {
"mobile:start": "yarn workspace mobile start",
"mobile:ios": "yarn workspace mobile ios",
"lint": "yarn workspaces run lint"
}
}
Expo SDK 50+는 npx create-expo-app으로 생성된 새 프로젝트에 yarn을 공식 권장합니다. yarn은 Expo 모듈과의 호환성을 보장하고 올바른 yarn.lock을 자동 생성합니다. yarn 3+의 Zero-Installs는 캐시를 리포지토리에 커밋할 수 있게 하여 개발자가 git clone 후 종속성 설치 없이 바로 사용 가능한 환경을 얻을 수 있습니다.
npm과 yarn은 동일한 문제를 해결합니다 — Node.js 패키지 관리입니다. npm 5-7의 출시로 기능적 격차는 사실상 사라졌습니다. npm 7+에는 workspaces, npm ci(yarn install --frozen-lockfile에 해당) 및 병렬 설치가 포함됩니다. 그러나 yarn은 특정 시나리오에서 이점을 유지합니다: Plug'n'Play, Zero-Installs 및 성숙한 constraints 시스템입니다.
| 특징 | npm | yarn |
|---|---|---|
| 생성 연도 | 2010 | 2016 |
| Lock 파일 | package-lock.json (JSON) | yarn.lock (YAML) |
| 설치 | 순차적 (npm 5+) | 병렬 |
| Plug'n'Play | 아니오 | 예 (yarn 2+) |
| Workspaces | 예 (npm 7+) | 예 |
| Zero-Installs | 아니오 | 예 (yarn 3+) |
| 캐시 | 플래트닝이 있는 node_modules | 글로벌 ~/.cache/yarn |
| 구현 언어 | JavaScript | TypeScript (yarn 2+) |
yarn을 선택해야 하는 경우: Expo SDK 50+ 프로젝트, 대규모 모노레포(100+ 패키지), 빠른 환경 설정을 위해 Zero-Installs를 중요시하는 팀, 이미 yarn을 사용 중인 레거시 프로젝트. npm을 선택해야 하는 경우: 표준 create-react-app 프로젝트, Next.js, Vite, 특정 패키지 매니저 요구사항이 없는 팀.
yarn 4(2024)는 향상된 성능, 네이티브 ESM 지원 및 대규모 모노레포 최적화를 도입했습니다. npm 10+는 보안 및 호환성에 중점을 두고 계속 발전하고 있습니다. 오늘날 npm과 yarn 사이의 선택은 팀 선호도와 특정 프로젝트 요구사항의 문제이지, 한 도구의 기술적 우월성의 문제가 아닙니다.
자주 묻는 질문
yarn은 병렬 패키지 설치와 적극적인 캐싱 덕분에 처음에는 속도에서 npm을 앞질렀습니다. yarn.lock은 모든 설치 시 자동 생성되는 반면, package-lock.json은 npm 5에서 등장했습니다. yarn은 설치 시간이 없는 node_modules의 대안인 Plug'n'Play를 제공합니다. npm 7+에서는 기본 시나리오에서 속도와 기능의 차이가 미미합니다.
yarn workspaces — 단일 리포지토리에서 여러 패키지를 관리하는 메커니즘입니다. 루트 package.json에 "workspaces": ["packages/*"] 필드가 포함됩니다. yarn install은 최상위 수준의 단일 node_modules에 공유 종속성을 설치하고, 로컬 패키지 간에 심링크를 만들고 중복을 방지합니다. 모든 workspace에 대한 명령은 yarn workspaces run <script>를 통해 실행됩니다.
Plug'n'Play(PnP) — yarn 2에서 도입된 기존 node_modules 폴더의 대안입니다. 파일을 복사하는 대신 yarn은 .pnp.cjs에 종속성 맵을 만들고 패키지를 글로벌 캐시의 ZIP 아카이브에 저장합니다. PnP 이점: 몇 초 만에 설치, Node.js 시작 시간 30-50% 감소, node_modules 및 관련 경로 문제 없음.
yarn을 글로벌로 설치: npm install -g yarn. 프로젝트 루트에서 yarn import를 실행하면 yarn이 package-lock.json을 읽고 동등한 yarn.lock을 만듭니다. node_modules와 package-lock.json을 삭제하고 yarn install을 실행하여 확인합니다. npm을 yarn으로 교체하여 CI/CD 구성을 업데이트합니다. yarn은 package.json과 완전히 호환됩니다.
"Integrity check failed" 오류는 yarn.lock과 node_modules가 동기화되지 않았을 때 발생합니다. 해결 방법: node_modules, yarn.lock을 삭제하고 캐시를 지운 후(yarn cache clean), yarn install을 다시 실행합니다. 버전 충돌의 경우 yarn upgrade-interactive를 사용하여 특정 업데이트를 선택합니다. yarn dedupe가 중복 패키지를 제거합니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.