전체 글

Bun 1.4 릴리스, Rust 재작성으로 바뀐 것 정리

xXfacebook페이스북

Bun 1.4가 2026년 8월 20일 정식으로 나왔습니다. 이번 버전의 핵심은 런타임 구현 언어를 Zig에서 Rust로 다시 쓴 것입니다. 여기서 가장 헷갈리기 쉬운 부분부터 짚겠습니다. JavaScript를 실제로 실행하는 엔진은 여전히 JavaScriptCore이고 바뀐 것은 그 엔진을 감싸 파일·네트워크·프로세스를 다루는 런타임 쪽 코드입니다. "엔진을 갈아끼웠다"가 아니라 "런타임을 구현한 시스템 언어를 바꿨다"가 정확한 표현입니다. 이번이 그 Rust 포트의 첫 정식 릴리스입니다.

이미 Bun을 쓰고 있다면 이번 릴리스에서 할 일은 사실상 bun upgrade 한 줄입니다. 체감상 달라지는 동작이 하나 있는데 뒤에서 따로 짚겠고 나머지는 대부분 조용히 좋아지는 쪽입니다. 공식 블로그가 든 수치로는 유휴 상태 CPU 사용량이 작은 앱 기준 5배 줄고 HTTP 서버 메모리가 프레임워크에 따라 13~48% 줄었으며 시작 속도가 2배 안팎 빨라졌습니다. 다만 이 수치들은 전부 Bun 1.3과 1.4를 비교한 것이지 Node.js와 비교한 것이 아닙니다. 이 글에서 나오는 성능 숫자는 모두 같은 기준으로 읽어 주십시오.

Bun 1.4의 변경 지점을 세 갈래로 나눈 그림. 왼쪽은 런타임 구현 언어가 Zig에서 Rust로 바뀐 것, 가운데는 JavaScriptCore 엔진이 그대로 유지된 것, 오른쪽은 CPU·메모리·시작 속도가 줄어든 것을 나타낸다.

JS 엔진은 그대로, 런타임 구현 언어만 Zig에서 Rust로 바뀌었다.

Bun 1.4, 무엇이 나왔나

버전 번호는 1.4.0이고 릴리스 날짜는 2026년 8월 20일입니다. 앞서 적었듯 이번 릴리스가 가진 상징성은 런타임을 Zig에서 Rust로 다시 쓴 첫 정식 버전이라는 점에 있습니다. Bun은 그동안 Zig로 작성된 런타임으로 알려져 있었고 이번에 그 구현을 Rust로 옮긴 결과물을 정식 버전으로 내놓았습니다.

다시 강조하면, 이 재작성은 JavaScript 실행 방식의 교체가 아닙니다. 스크립트를 파싱하고 실행하는 일은 계속 JavaScriptCore가 맡습니다. 바뀐 것은 파일 입출력, 네트워크, 프로세스 관리처럼 런타임이 직접 구현하는 부분을 어떤 시스템 언어로 짰느냐입니다. 공식 블로그는 이번 재작성을 왜 했는지에 대한 동기를 따로 밝히지 않았으므로, 이유에 대한 추측은 이 글에서 다루지 않겠습니다. 확인되지 않은 배경을 채워 넣기보다, 릴리스 노트가 실제로 말한 변경점만 아래에서 하나씩 보겠습니다.

Node.js 호환성이 얼마나 좋아졌나

Bun을 실무에 넣을 때 가장 먼저 걸리는 것이 Node.js 호환성입니다. 1.4는 이 부분에서 눈에 띄는 숫자를 내놓았습니다. Node.js 테스트 스위트에서 1,517개의 테스트가 추가로 통과했고 2,900개 이상의 이슈가 수정되었습니다.

모듈별 통과율도 함께 공개되었는데, 여기서 오해하기 쉬운 부분이 있어 그대로 옮깁니다. node:http, node:fs, node:cluster, node:timers, node:zlib, node:vm, node:stream 이 7개 모듈이 함께 97% 통과입니다. "node:http만 97%"가 아니라 이 묶음이 같은 수치라는 뜻입니다. node:quic는 99%, node:events·node:trace_events·node:sqlite는 100% 통과입니다.

Node.js 모듈별 통과율을 가로 막대로 나타낸 그림. events·trace_events·sqlite가 100%, quic이 99%, http·fs·cluster·timers·zlib·vm·stream 묶음이 97%로 표시된다.

http·fs 등 7개 모듈이 함께 97%, sqlite·events는 100%다.

성능 수치로 보는 변화

성능 수치는 CPU, 메모리, 시작 속도 세 갈래로 정리됩니다. 다시 말하지만 아래 숫자는 모두 Bun 1.3과 1.4를 비교한 값입니다.

CPU 쪽에서는 유휴 상태 CPU 사용량이 5배 줄었다는 수치가 눈에 띕니다. 단 이 값은 작은 hello world 앱을 돌렸을 때의 조건이므로, 어떤 앱이든 5배 줄어든다는 뜻으로 일반화하면 안 됩니다. 또 공식 블로그는 Claude Code를 Rust 포트를 수개월간 프로덕션에서 써 온 사용자로 소개하며 버전 간 프로덕션 CPU 사용량이 절반으로 줄었다고 적었습니다. 구체적으로 p99가 24%에서 10%로, p50이 5.8%에서 2.5%로 내려갔습니다.

메모리는 HTTP 서버에서 측정한 값이 나왔습니다. Fastify 서버가 233MB에서 120MB로 약 48% 줄었고 Express는 169MB에서 92MB로 약 46% 줄었습니다. 프레임워크에 따라 감소 폭은 13~48% 범위입니다. 시작 속도는 윈도우에서 39.0ms에서 15.5ms로 약 2.5배, 리눅스에서 10.9ms에서 5.1ms로 약 2배 빨라졌습니다.

CPU·메모리·시작 속도 변화를 세 칸으로 나눈 비교 그림. 각 칸에 Bun 1.3 값과 1.4 값이 나란히 놓이고, 모든 수치가 1.3 대비 1.4 비교임을 밝히는 문구가 아래에 적혀 있다.

모든 수치는 Bun 1.3 대 1.4 비교다. Node.js와의 비교가 아니다.

새로 들어온 것: 내장된 npm 패키지 15개

1.4는 자주 쓰이는 npm 패키지 15개를 런타임에 내장했습니다. 별도로 설치하지 않아도 바로 쓸 수 있게 된 목록은 다음과 같습니다.

  • sharp, puppeteer, marked, node-cron, node-pty
  • concurrently, npm-run-all, serve-static, json5, fast-xml-parser
  • tar, string-width, slice-ansi, cli-truncate, wrap-ansi

이미지 처리(sharp)나 헤드리스 브라우저(puppeteer)처럼 설치가 번거롭던 것들이 포함되어 있어 초기 설정에서 손이 덜 갈 여지가 있습니다. 어떤 프로젝트에 얼마나 도움이 될지는 쓰는 스택에 따라 다르므로, 목록을 두고 자신의 의존성과 겹치는 게 있는지 확인해 보는 정도가 적당합니다.

내장된 npm 패키지 15개를 카드 형태로 나열한 그림. sharp, puppeteer, marked 등 패키지 이름이 격자로 배치되어 있다.

15개 패키지가 런타임에 내장되어 별도 설치 없이 바로 쓸 수 있다.

업그레이드 전에 확인할 것

업그레이드 자체는 bun upgrade 한 줄입니다. 다만 이번 릴리스에서 체감할 수 있는 동작 변경이 하나 있어 이 부분만 따로 봐야 합니다.

프로덕션에서 Bun.serve가 HTML 라우트에 대한 소스맵을 더 이상 제공하지 않습니다. 개발 모드에서는 이전과 동일하게 동작합니다. 프로덕션에서도 소스맵을 내보내려면 bunfig.toml의 [serve.static]에서 sourcemap 옵션을 명시적으로 설정하면 됩니다. 소스맵이 배포 환경에 노출되던 것을 기본값에서 끈 셈이므로, 이 동작에 의존하던 설정이 있었다면 업그레이드 전에 확인해 두는 편이 안전합니다.

정리 — 지금 올릴 만한가

Bun 1.4는 런타임 구현을 Rust로 옮긴 첫 정식 버전이고 공개된 수치상 유휴 CPU·메모리·시작 속도가 1.3 대비 줄었습니다. Node.js 호환 테스트도 1,517개 늘었습니다.

다만 성능 수치는 전부 1.3과의 비교이고 유휴 CPU 5배 같은 값은 특정 조건에서 나온 것입니다. 이미 Bun을 쓰는 환경이라면 소스맵 동작 변경 하나만 확인하고 bun upgrade로 올려 볼 만합니다. 새로 도입할지는 각자의 스택에서 호환성을 직접 확인해 본 뒤 판단하는 게 맞습니다.

근거와 참고

이 글 공유하기xXfacebook페이스북