Yarn Berry 4.0의 변화
1. Yarn Berry 4.0의 주요 개선 사항
2023년 10월 23일, Yarn Berry의 4.0 릴리즈가 스테이블 버전으로 등장했습니다. 4.0 메이저 업데이트는 내부 아키텍처와 사용 방식, 그리고 성능 측면에서 개선이 되었습니다. 그러나 변화의 이면에는 Zero Install 전략과 관련된 여러 문제점도 내포되어 있어, 이를 보완하기 위해 pnpm과 같은 다른 도구로 전환하기도 했습니다. 이 포스트에서는 Yarn Berry 4.0의 주요 변경점, Zero Install의 장단점, 그리고 pnpm으로 전환한 이유에 대해 자세히 살펴보겠습니다.
1.1 Node.js 18 이상 요구
Yarn Berry 4.0은 이제 Node.js 18 이상의 버전을 필요로 합니다.
- 배경 최신 Node.js 버전은 V8 엔진의 성능 개선, 보안 패치, 그리고 새로운 JavaScript 기능들을 포함하고 있어, Yarn의 내부 동작과 성능 최적화에 도움이 됩니다.
- 의미 개발자들은 이제 최신 Node.js 기능을 활용할 수 있으며, Yarn의 실행 환경이 보다 안전하고 효율적으로 개선되었습니다.
1.2 Zero Install, 기본 설정에서 제외
Zero Install 전략은 한때 “의존성 설치 없이 바로 실행할 수 있다”는 점에서 매력적이었으나, 실제 운영 환경에서는 여러 단점을 드러냈습니다.
- 기존 전략
- 프로젝트에 의존성 캐시(.yarn/cache)를 포함시켜, 초기 설치 과정을 생략하고 모든 개발자가 동일한 환경에서 작업하도록 보장했습니다.
- 문제점
- 저장소 크기 문제: 단순 프론트엔드 프로젝트에서도 100MB 이상의 캐시 파일이 생성되고, 무거운 프로젝트의 경우 500MB가 넘는 경우도 흔합니다.
- Git 부하: Git 커밋 시, 압축된 대용량 파일이 함께 기록되며 GitHub 무료 대역폭(1GiB 제한) 문제에 직면할 수 있습니다.
- 협업의 어려움: 여러 개발자가 작업하면서 빈번히 의존성이 변경되면, 커밋 기록에 쌓이는 캐시 파일이 코드 리뷰 및 브랜치 전환 속도에 영향을 줄 수 있습니다.
- 변경사항
- 문제점을 인지 했는지 Yarn Berry 4.0에서는 Zero Install이 기본값이 아니게 되었으며, 필요에 따라 사용자가 선택할 수 있도록 변경되었습니다.
- 이를 통해 불필요한 Git 부하와 저장소 관리의 복잡성을 줄이고,유연하게 의존성 관리 방식을 선택할 수 있도록 하였습니다.
1.3 공식 플러그인 통합 및 CLI 개선
Yarn Berry 4.0은 다양한 플러그인을 별도로 설치할 필요 없이 기본 기능으로 포함시켜 사용성을 높였습니다.
- 포함된 공식 플러그인
- TypeScript 지원, 인터랙티브 도구, 그리고 기타 유용한 개발 도구들이 기본적으로 내장되어 플러그인 관리의 번거로움이 줄어들었습니다.
- CLI 명령어 변화
- Yarn Workspaces의 일부 명령어 문법이 변경되었으며, 사용자 인터페이스(UI)가 재설계되어 더 직관적이고 명확하게 정보를 전달합니다.
- Corepack 도입
- 이전에는 프로젝트 내부에 yarnPath를 설정하여 Yarn 바이너리를 함께 관리했지만, 이제는 Corepack과 packageManager 필드를 활용해 Node.js 18 이상 환경에서 자동으로 올바른 패키지 매니저 버전을 선택합니다.
- 이로 인해 프로젝트 초기 설정이 단순해지고, 여러 프로젝트 간 Yarn 버전 충돌 문제를 줄일 수 있습니다.
1.4 성능 개선
Yarn Berry 4.0은 내부 캐시 시스템과 모듈 해석 속도, 그리고 전체 설치 과정의 효율성을 크게 개선했습니다.
- 벤치마크 결과
- 공식 벤치마크에 따르면, Yarn 4.0은 3.6 버전 대비 최대 3~4배 빠른 설치 속도를 보여줍니다.
- 특히 PnP(Plug'n'Play) 모드를 사용할 때 의존성 트리 분석과 설치 속도가 크게 단축되어, “어떻게 이렇게 빠르지?”라는 체감 성능을 경험할 수 있습니다.
- Hardened Mode
- 보안을 강화하기 위해 Hardened Mode가 도입되었습니다. 이 모드는 lockfile의 해상도(resolution)와 원격 레지스트리 메타데이터의 일관성을 검증하여, 악의적인 변경이나 공격을 방지합니다.
- 다만, 추가 검증 과정으로 인해 설치 속도가 평소보다 느려질 수 있으므로 CI/CD 환경에서는 필요에 따라 활성화하는 것이 좋다고 합니다.
- 제약 조건 엔진 개선
- 기존 Prolog 기반 제약 조건 엔진은 사용이 어려웠던 점을 보완하기 위해 JavaScript 및 TypeScript 기반의 새로운 엔진으로 대체되었습니다.
- 이로 인해 개발자들은 프로젝트 내 의존성 버전이나 패키지 간 관계에 대한 규칙을 보다 쉽게 정의하고 관리할 수 있게 되었습니다.
2. Zero Install 전략: 매력과 문제점
2.1 Zero Install의 장점
- 빠른 환경 구축
- 의존성이 미리 캐시되어 있기 때문에, 새로운 개발 환경에서 빠르게 프로젝트를 실행할 수 있습니다.
- 일관된 개발 환경
- 모든 개발자가 동일한 캐시를 사용함으로써, 의존성 버전 불일치나 환경 차이로 인한 문제를 최소화할 수 있습니다.
2.2 Zero Install의 단점과 한계
- Git 저장소 부담
- 압축된 의존성 파일이 Git 커밋에 포함되면, 리포지토리의 용량이 급격히 증가합니다.
- GitHub와 같은 플랫폼에서는 무료 대역폭 제한에 걸릴 수 있으며, 커밋 히스토리에 쌓이는 대용량 파일로 인해 브랜치 전환이나 체크아웃 시 속도 저하가 발생할 수 있습니다.
- 관리 복잡성
- 의존성 업데이트가 있을 때마다, 캐시 파일의 재생성 및 관리 작업이 추가로 발생합니다.
- 협업 환경에서는 각 개발자마다 캐시 파일의 변경 내역이 불필요하게 커밋되어 코드 리뷰 및 버전 관리에 부정적인 영향을 줄 수 있습니다.
- 실제 체감 성능
- 초기 설치 시에는 큰 장점이 있으나, 이미 캐시가 구축된 이후의 설치 속도는 다른 방식과 비교해 큰 차이가 없거나 오히려 불편한 경우도 있습니다.
- 운영 비용 증가
- Git LFS와 같은 솔루션을 도입해야 할 수도 있고, 주기적으로 Git history 정리 작업을 해야 하는 등 추가적인 운영 부담이 발생합니다.
Git LFS와 같은 솔루션을 도입해야 할 수도 있고, 주기적으로 Git history 정리 작업을 해야 하는 등 추가적인 운영 부담이 발생합니다. Yarn Berry 4.0은 이러한 문제점을 인지하고, Zero Install을 기본 설정에서 제외하여 상황에 따라 개발자가 선택할 수 있도록 유연성을 부여했습니다.
3. pnpm 전환 사례와 선택의 배경
Yarn Berry v4전에는 yarn에서 pnpm으로 전환하는 하는 경우도 꽤 있었습니다.
3.1 Git 부하와 PnP의 한계
- 문제
- Yarn의 PnP 모드를 사용하면 node_modules 폴더 대신 압축된 캐시(.yarn/cache)가 생성되는데, 이 캐시가 Git 커밋에 포함되면서 대용량 파일 문제가 발생합니다.
- 실제로 많은 커밋이 누적되는 상황에서는 Git의 체크아웃, 브랜칭 속도에 영향을 미치고, GitHub 무료 대역폭을 초과하는 이슈가 있습니다.
- pnpm의 접근 방식
- pnpm은 전역 가상 저장소(Virtual Store)와 심볼릭 링크를 활용하여, 실제로 필요한 의존성만을 로컬에 설치합니다.
- 이 방식은 Git 커밋에 불필요한 파일이 포함되지 않으며, 저장 공간과 네트워크 사용량을 크게 절감할 수 있습니다.
Note: 심볼릭 링크(Symbolic Link)는 파일 시스템에서 다른 파일이나 디렉터리에 대한 참조(포인터)를 제공하는 특별한 종류의 파일입니다. 이는 윈도우의 바로 가기와 유사한 역할을 하며, 리눅스와 유닉스 계열 운영체제에서 주로 사용됩니다.패키지 매니저에서의 활용: pnpm 같은 패키지 매니저는 심볼릭 링크를 사용해 중앙 저장소에 있는 패키지 파일들을 개별 프로젝트의 node_modules 디렉터리에 연결합니다. 이렇게 하면, 동일한 패키지를 여러 프로젝트에서 공유할 수 있어 디스크 사용량을 줄이고 설치 속도를 빠르게 할 수 있습니다.
3.2 Ghost Dependency 문제와 의존성 관리
- Ghost Dependency 현상
- 의존성 관리 과정에서 실제로 설치하지 않은 패키지나, 의도치 않게 포함되는 패키지가 발생할 경우, 프로덕션 환경에서 예기치 않은 오류를 발생시킬 위험이 있습니다.
- 이러한 문제는 복잡한 의존성 트리에서 더 쉽게 발생하며, 디버깅에 상당한 시간과 노력이 필요합니다.
- pnpm의 장점
- pnpm은 명시적으로 package.json에 기록된 의존성만을 참조하는 구조를 갖추어, 불필요한 패키지의 설치를 원천 차단합니다.
- 또한, 하드 링크와 심볼릭 링크를 사용해 동일 패키지의 중복 설치를 막아, 저장공간 효율과 설치 속도를 동시에 개선합니다.
3.3 Yarn Workspace의 불편함
- 문제
- Yarn Workspace를 사용하면서 디렉터리 참조 오류나, 패키지 간 의존성 관리의 버그 등 여러 문제가 보고되었습니다.
- 특히, 프로젝트의 규모가 커지면 의존성 관리를 위해 추가 작업이 필요해지고, 협업 환경에서 여러 문제가 동시에 발생할 가능성이 있습니다.
- pnpm의 간결한 설정:
- pnpm은 pnpm-workspace.yml 파일 하나만으로 모노레포 구성을 손쉽게 관리할 수 있으며, 각 패키지가 자동으로 연결되므로 별도의 설치나 링크 작업이 필요 없습니다.
- 이로 인해 모노레포 환경에서의 설정과 유지 보수가 훨씬 단순해집니다.
4. 결론
Yarn Berry 4.0은 단순한 버전 업그레이드를 넘어 내부 아키텍처, 성능, 보안, 그리고 사용자 경험 등 다양한 측면에서 개선 되었습니다.
- 장점
- Node.js 최신 기능 활용, Corepack을 통한 간편한 버전 관리, 개선된 PnP 성능 및 공식 플러그인 통합 등이 Yarn을 다시 괜찮은 선택지로 만들고 있습니다.
- 문제점
- Zero Install 전략의 부작용, Git 커밋 및 저장소 관리의 부담 등은 여전히 이슈로 남아 있습니다.
- pnpm의 강점
- 전역 가상 저장소와 심볼릭 링크를 통한 효율적인 의존성 관리, Git 부하 감소, 모노레포 설정의 단순화 등이 pnpm을 선택하게 만드는 중요한 요소입니다.
댓글 로딩 중...