AI Briefing

Nx에서 Bun을 더 잘 쓰기: Nx 18에서 21로 마이그레이션

·2026.01.30 14:00

Nx 18과 Bun 조합의 한계를 넘기 위해 Nx 21.4+와 Bun 1.2.x로 올렸다.

핀테크그룹 프론트엔드는 모노레포 관리 도구로 Nx를, 패키지 매니저로는 Bun을 사용해 왔다. 다만 Nx 18.3.3은 Bun을 공식 지원하지 않아, 실제 운영에서는 예상치 못한 호환성 문제가 계속 남아 있었다.

가장 먼저 부딪힌 문제는 nx migrateYarn을 패키지 매니저로 오인한 일이었다. 루트에 yarn.lock이 남아 있었기 때문에 Nx가 Yarn을 선택했고, 로컬에 Yarn이 없어 설치 단계가 실패했다. 마이그레이션 시점에만 yarn.lock을 임시 제거해 우회했고, Nx 19.5+에서 Bun 공식 지원을 받는 흐름으로 넘어갔다.

두 번째 문제는 webpack 빌드에서 generatePackageJson: true를 켰을 때 발생한 HookWebpackError: Cannot read properties of undefined (reading 'data')였다. Nx가 빌드 산출물의 package.json을 만들기 위해 프로젝트 그래프의 External Node 메타데이터를 읽는 과정에서, 구버전 Bun의 bun.lockb(바이너리 형식)를 제대로 해석하지 못하는 상황이 원인이었다.

우회책으로는 generatePackageJson: false로 바꾸거나 커스텀 플러그인을 붙이는 방법이 있었지만, 유지보수 부담이 컸다. 마침 Storybook 9 마이그레이션을 검토 중이었고, 최소 지원 버전이 Nx 21.2였기 때문에, 결국 Bun 1.2.x로 올려 bun.lockbbun.lock으로 전환하고, **Nx 21.4+**로 업그레이드하는 쪽이 더 합리적이라고 판단했다.

이 전환으로 bun.lockb의 바이너리 제약도 함께 해소됐다. PR diff를 볼 수 없고, merge 충돌 해결이 어렵고, 외부 도구가 파싱하기 힘들던 문제가 사라졌고, Nx의 Bun 처리도 안정화됐다. 결과적으로 CI 파이프라인은 13분 30초에서 11분 40초로 약 14% 단축, Artifact 크기는 330MB에서 280MB로 약 15% 감소했다.

정량적 개선 외에도 bun.lockbyarn.lock의 이중 관리가 사라졌고, Dependabot PR의 변경사항도 텍스트 diff로 확인 가능해졌다. 공식 미지원 조합을 쓸 때는 지원 로드맵, 관련 이슈, lock file 호환성, 롤백 플랜을 미리 확인해야 하며, 메이저 업그레이드는 안정화 시점마다 미루지 않고 진행하는 편이 장기적으로 안전하다는 점도 함께 정리했다.

이 요약은 원문 이해를 돕기 위한 큐레이션입니다. 저작권은 원저작자에게 있으며, 정확한 내용과 맥락은 원문을 확인하세요.

요약 오류, 출처 표기 문제, 삭제 요청은 문의 · 건의로 알려주세요.