자바스크립트 스트림 API, 더 나은 대안이 나타났다!
WHATWG 스트림 표준(Web streams)은 브라우저와 서버 간의 데이터 스트리밍을 위한 공통 API로 설계되었으나, 사용성 및 성능 문제를 지적받음
Async iteration 도입 이전 설계로 인해, 락 관리(Lock Management), BYOB(Bring Your Own Buffer) 등 불필요한 복잡성을 야기함
새로운 API는 AsyncIterable을 기반으로 하여, 간결하고 직관적인 스트림 처리를 지원하며, 최대 120배 빠른 성능을 보임
기존 Web streams의 락킹(Locking) 모델은 잦은 락 해제(releaseLock) 누락으로 인한 문제 발생
새로운 API는 Pull-through transforms 및 명시적인 Backpressure 정책을 통해, 성능과 안정성을 동시에 확보함
Web streams의 근본적인 문제점
본문에서는 Web streams API가 Async iteration 도입 전에 설계되어, 현재 자바스크립트(JavaScript) 개발 방식과 맞지 않는다고 지적한다. 특히, getReader()와 releaseLock()을 이용한 수동적인 락 관리(Lock Management)는 개발자에게 불필요한 부담을 주고, 락 해제(releaseLock) 누락 시 스트림이 영구적으로 잠기는 문제를 야기한다. 또한, BYOB(Bring Your Own Buffer) 방식은 복잡성만 증가시키고, 실제 성능 향상에는 기여하지 못하는 것으로 분석된다. 이러한 문제들은 Web streams API의 근본적인 설계 결함에서 기인하며, 점진적인 개선으로는 해결하기 어렵다고 강조한다.
새로운 스트림 API의 핵심 설계 원리
새로운 API는 AsyncIterable을 핵심으로 하여, 스트림을 AsyncIterable로 취급한다. 이는 for await...of 구문을 통해 간결하고 직관적인 스트림 처리를 가능하게 한다. 또한, Pull-through transforms 방식을 채택하여, 데이터가 소비될 때만 변환이 이루어지도록 설계했다. 이는 불필요한 버퍼링을 방지하고, 성능을 향상시키는 데 기여한다. 명시적인 Backpressure 정책을 통해, strict, block, drop-oldest, drop-newest 등 다양한 정책을 선택할 수 있도록 하여, 개발자가 상황에 맞는 유연한 제어를 할 수 있도록 지원한다.
성능 벤치마크 분석: Web streams vs 새로운 API
본문에 따르면 새로운 API는 Web streams에 비해 전반적으로 뛰어난 성능을 보인다. 특히, Chained 3× transforms 환경에서 최대 80~90배, Async iteration 환경에서 40~100배의 성능 향상을 기록했다. 이러한 성능 향상은 Batching을 통한 Async 오버헤드 감소, Pull semantics를 통한 중간 버퍼링 제거, 그리고 동기적인 빠른 경로(Synchronous fast paths) 활용 가능성에서 기인한다. Node.js, Deno, Bun, 그리고 주요 브라우저 환경에서 일관된 성능 향상을 보이며, 특히 Transform chain 환경에서 두드러진 성능 개선을 보여준다.
새로운 API의 장점: 간결성 및 유연성
새로운 API는 기존 Web streams에 비해 훨씬 간결하고 사용하기 쉽다. 예를 들어, 간단한 producer/consumer 쌍을 생성하는 데 필요한 코드가 대폭 줄어든다. 또한, Writer 인터페이스가 단순하여 기존 API를 쉽게 적용하거나, 특수한 구현을 만들 수 있다. Pull-through transforms를 통해, 변환(Transform)이 소비 시점에 실행되므로, 불필요한 자원 낭비를 줄일 수 있다. 명시적인 Backpressure 정책은 개발자가 데이터 흐름을 세밀하게 제어할 수 있도록 돕고, Sync/async separation을 통해, 동기적인 데이터 소스(Data Source)와 변환(Transform)에 대한 오버헤드를 줄일 수 있다.
Web streams API의 한계와 미래
Web streams API는 2014년 당시에는 획기적인 시도였지만, 현재 자바스크립트(JavaScript)의 발전과 개발 환경의 변화에 따라 여러 문제점을 드러냈다. 특히, 락 관리(Lock Management)의 복잡성, BYOB(Bring Your Own Buffer)의 비효율성, 그리고 성능 최적화를 위한 런타임별 꼼수(Workarounds)는 API의 유지보수성을 저해한다. 새로운 API는 이러한 문제점을 해결하고, 더 나은 스트리밍 경험을 제공하기 위한 대안으로 제시되었다. 본문은 새로운 API가 아직 초기 단계임을 강조하며, 개발자들의 피드백을 통해 지속적으로 개선해 나갈 것을 시사한다.