Nx와 Bun 조합, 공식 지원 전 마이그레이션 험난했던 여정

by DD
4개월 전
조회수 14

Nx 18에서 Bun을 패키지 매니저로 사용하며, 공식 지원 이전의 문제점들을 경험

Yarn lock file 우선순위로 인해 Nx가 Bun 대신 Yarn을 사용하려 했으나, 임시 해결

webpack 빌드 시 lock file 파싱 실패 문제 발생, Nx 21.4+Bun 1.2.x 업그레이드로 해결

Bun 1.2.x로의 업그레이드를 통해 바이너리 형태의 lock file을 텍스트 형식으로 변경, Dependabot 지원 및 성능 개선

마이그레이션 결과, CI 파이프라인 시간 14% 단축 및 아티팩트 크기 15% 감소

Nx와 Bun의 패키지 매니저 감지 로직 분석

Nx는 패키지 매니저를 감지하기 위해 루트 디렉토리에 존재하는 lock file의 존재 여부를 확인한다.

Yarn, pnpm, npm 순으로 우선순위를 가지며, bun.lockb는 감지 대상에서 제외

bun.lockb 파일이 존재해도 yarn.lock이 있으면 Yarn을 사용한다고 판단

해결책: 마이그레이션 과정에서 임시로 yarn.lock을 제거하여 npm으로 fallback

이러한 로직은 Nx 18.x에서 Bun을 공식 지원하지 않았기 때문에 발생한 문제이며, Nx 19.5+부터는 bun.lock 또는 bun.lockb를 인식하여 해결되었다.

webpack 빌드 시 lock file 파싱 실패 원인

Nx에서 webpack 기반 애플리케이션 빌드 시, generatePackageJson: true 옵션 사용 시 오류가 발생했다.

External Node 메타데이터: 프로젝트 의존성 그래프에서 외부 npm 패키지를 나타내는 노드

문제 원인: 구 버전 Bun의 bun.lockb(바이너리)에서 External Node 메타데이터 해석 누락

해결 방법: generatePackageJson: false로 변경하거나, 커스텀 webpack 플러그인으로 메타데이터 주입

하지만 기술 부채 리스크를 고려하여, Nx 21.4+ 및 Bun 1.2.x로 업그레이드하여 근본적으로 해결했다.

bun.lockb에서 bun.lock으로의 전환 배경

Bun 1.2.x로 업그레이드하면서 lock file 형식이 bun.lockb(바이너리)에서 bun.lock(텍스트, JSONC 형식)으로 변경되었다.

바이너리 형식의 문제점: PR 리뷰 불가, Merge 충돌 수동 해결, 도구 호환성 문제

텍스트 형식의 장점: 외부 도구(Nx, Dependabot 등)에서 lock file 파싱 가능

성능 개선: 텍스트 형식 전환 이후에도 내부 최적화로 약 30% 성능 향상

결과적으로, 텍스트 형식으로의 전환은 개발 생산성(Developer Productivity) 향상과 지속적인 통합(Continuous Integration)을 가능하게 했다.

마이그레이션 결과: CI 파이프라인 개선

마이그레이션 완료 후, CI 파이프라인(CI Pipeline) 성능이 개선되었다.

CI 파이프라인 시간: 13분 30초 → 11분 40초로 단축(-14%)

Artifact 크기: 330MB → 280MB로 감소(-15%)

부수적 개선: bun.lock 단일 파일 관리, Dependabot PR diff 확인 가능, Nx 업그레이드 시 호환성 걱정 감소

이러한 결과는 빌드 시간 단축(Build Time Reduction), 코드 품질 향상(Code Quality Improvement), 그리고 유지보수성(Maintainability) 증진으로 이어진다.

공식 미지원 도구 조합 사용 시 고려사항

공식적으로 지원되지 않는 도구 조합을 사용할 때는 다음과 같은 사항을 미리 확인해야 한다.

공식 지원 로드맵: GitHub Discussions, 블로그 등을 통해 확인

관련 GitHub 이슈: 얼마나 있는지, 해결되고 있는지 확인

lock file 호환성: lock file이 제대로 작동하는지 확인

롤백 플랜: 문제 발생 시 롤백할 수 있는 계획 수립

이러한 점들을 고려하여, 기술 부채(Technical Debt)를 최소화하고, 프로젝트의 안정성(Project Stability)을 확보해야 한다.

Nx에서 Bun 더 잘 사용하기: Nx 18 -> 21 마이그레이션