한국정보기술진흥원
한국정보기술신문
thumbnail

정보기술 ·

Bun v1.3.9 출시...다중 스크립트 병렬 실행 기능 추가

발행일
읽는 시간2분 54초

자바스크립트 런타임 Bun, 병렬 작업과 성능 개선 기능 대거 포함

[한국정보기술신문] 자바스크립트 런타임 Bun이 2월 8일 버전 1.3.9를 공식 발표했다. 이번 업데이트는 여러 스크립트를 병렬 또는 순차적으로 실행할 수 있는 새로운 기능을 비롯해 성능 개선 사항과 다양한 버그 수정을 포함하고 있다.

Bun은 Node.js를 대체할 수 있는 빠른 자바스크립트 런타임으로, 내장 번들러와 테스트 러너를 제공하며 웹 표준 API를 지원한다. 최근 개발자 커뮤니티에서 주목받고 있는 도구로, 빠른 설치 속도와 실행 성능으로 평가받고 있다.

병렬 및 순차 실행 기능 추가

이번 버전의 핵심 기능은 bun run --parallelbun run --sequential 명령어 추가다. 이 기능을 통해 개발자는 package.json에 정의된 여러 스크립트를 동시에 또는 순서대로 실행할 수 있다. 각 스크립트의 출력은 색상으로 구분된 접두사와 함께 표시되어 어떤 스크립트에서 출력되었는지 쉽게 확인할 수 있다.

병렬 실행 모드는 모든 스크립트를 즉시 시작하고 출력을 인터리브하는 방식으로 작동한다. 순차 실행 모드는 스크립트를 하나씩 순서대로 실행한다. 기본적으로 하나의 스크립트가 실패하면 나머지 스크립트도 중단되지만, --no-exit-on-error 옵션을 사용하면 모든 스크립트를 끝까지 실행할 수 있다.

이 기능은 워크스페이스 필터링과도 통합되어 있다. --filter 또는 --workspaces 옵션과 함께 사용하면 여러 패키지에서 동시에 또는 순차적으로 빌드, 테스트, 린트 작업을 수행할 수 있다. 사전 실행 스크립트와 사후 실행 스크립트도 자동으로 그룹화되어 올바른 의존성 순서로 실행된다.

HTTP/2 연결 업그레이드 지원

Bun은 이번 업데이트에서 Node.js의 net.Server를 통한 HTTP/2 연결 업그레이드 패턴을 완전히 지원한다. 이 패턴은 http2-wrapper, crawlee와 같은 라이브러리에서 사용되며, 원시 TCP 연결을 수신하고 이를 HTTP/2 서버로 전달하는 커스텀 HTTP/2 프록시 서버에서도 활용된다.

개발자는 net.Server에서 원시 TCP 소켓을 수신한 후 h2Server.emit('connection', rawSocket) 호출을 통해 이를 HTTP/2 서버로 전달할 수 있다. 이전에는 이 패턴이 제대로 작동하지 않았으나 이번 버전에서 수정되었다.

테스트 도구 개선

Bun의 테스트 프레임워크에도 개선 사항이 포함되었다. mock()spyOn() 함수가 이제 Symbol.dispose를 구현해 using 키워드를 통한 자동 정리를 지원한다. 이를 통해 개발자는 모의 함수가 범위를 벗어날 때 자동으로 복원되도록 할 수 있어 수동으로 mockRestore()를 호출하거나 afterEach 훅에 의존할 필요가 없다.

이 기능은 테스트 코드를 더 간결하게 만들고 정리 누락으로 인한 버그를 방지하는 데 도움이 된다. Symbol.disposemockRestore의 별칭으로 작동하며 spyOn()mock() 모두에서 사용할 수 있다.

성능 개선

JavaScriptCore 엔진 업그레이드를 통해 여러 성능 개선이 이루어졌다. 정규 표현식은 SIMD 가속 접두사 검색을 통해 크게 빨라졌다. 대체 패턴의 선행 문자를 SIMD 명령어를 사용해 한 번에 16바이트씩 스캔하여 일치하지 않는 위치를 빠르게 거부한다.

문자열 관련 메서드도 최적화되었다. String.prototype.startsWith는 DFG와 FTL JIT 계층에서 고유 함수로 처리되어 최대 5.76배 빠르게 작동한다. String.prototype.trim과 관련 메서드들도 직접 포인터 접근을 사용해 최대 1.42배 향상되었다. SetMapsize 속성 접근도 고유 함수로 최적화되어 각각 2.24배와 2.74배 빠르게 작동한다.

Markdown 처리 성능도 개선되었다. Bun.Markdown은 SIMD 가속 스캔을 사용해 HTML 이스케이프가 필요한 문자를 찾아 3~15% 빠른 렌더링 속도를 제공한다. Bun.markdown.react()는 자주 사용되는 HTML 태그 문자열을 캐시하여 소형 문서 렌더링이 28% 빠르게 작동한다.

버그 수정 및 기타 개선

이번 업데이트는 다수의 버그 수정도 포함한다. 윈도우에서 existsSync('.')와 같은 현재 디렉터리 참조가 실패하던 문제가 해결되었다. HTTP/2 구현에서 발생하던 3건의 드물지만 심각한 충돌 문제도 수정되었다.

프록시 설정 관련 개선도 이루어졌다. 이전에는 NO_PROXY 환경 변수가 명시적으로 전달된 프록시 옵션에 대해 무시되었으나, 이제는 fetch()나 WebSocket에 프록시를 명시적으로 지정한 경우에도 NO_PROXY 설정이 적용된다.

ARM64 아키텍처의 오래된 프로세서에서 발생하던 불법 명령어 충돌 문제도 해결되었다. mimalloc이 ARMv8.1 이상이 필요한 LSE 원자 명령어를 생성하여 Cortex-A53, 라즈베리 파이 4, AWS a1 인스턴스 등에서 충돌을 일으키던 문제가 수정되었다. Bun은 이제 리눅스 aarch64에서 ARMv8.0을 올바르게 타겟팅하고 런타임 디스패치를 위한 아웃라인 원자 함수를 사용한다.

Bun은 계속해서 Node.js 호환성을 개선하고 있으며 이번 버전에서도 여러 Node.js API의 동작이 수정되었다. Function.prototype.toString()의 공백 처리가 V8 및 Node.js와 일치하도록 개선되었고, TypeScript 타입 정의도 여러 곳에서 업데이트되었다.

이번 릴리스에는 10명의 기여자가 참여했으며, 설치는 공식 웹사이트를 통해 할 수 있다. 기존 사용자는 bun upgrade 명령어로 업데이트할 수 있다.

한국정보기술신문 정보기술분과 김지원 기자 news@kitpa.org