Zero-native: Zig와 WebView를 활용한 데스크톱 앱 개발 재고
데스크톱 애플리케이션 개발 환경은 오랫동안 웹 기술의 풍부함과 네이티브 바이너리의 성능 사이에서 끊임없는 갈등을 겪어왔습니다. 수년간 Electron은 전체 Chromium 인스턴스와 Node.js 런타임을 번들링함으로써 이 영역을 장악했으며, 개발자에게 엄청난 유연성을 제공하는 대신 거대한 바이너리 크기와 상당한 RAM 사용량이라는 대가를 치르게 했습니다.
zero-native는 Vercel Labs에서 새롭게 선보이는 프로젝트로, 이 격차를 메우는 것을 목표로 합니다. Zig 프로그래밍 언어와 시스템 네이티브 WebView를 활용함으로써, zero-native는 웹처럼 느껴지면서도 네이티브 애플리케이션처럼 동작하는 개발 경험을 약속합니다. 현대 데스크톱 프레임워크의 "bloat"를 겨냥해 서브 메가바이트 바이너리와 즉각적인 재빌드를 가능하게 하는 길을 제시합니다.
핵심 아키텍처: Zig + WebView
zero-native는 본질적으로 가벼운 쉘을 목표로 설계되었습니다. 무거운 브라우저 엔진을 번들링하는 대신, 기본값으로 system WebView—운영 체제에 이미 내장된 브라우저 엔진—를 사용합니다. 이러한 아키텍처 선택 덕분에 결과 바이너리는 자체 렌더링 엔진을 포함할 필요가 없어 매우 작게 유지됩니다.
주요 기술적 장점
- 작은 바이너리와 낮은 메모리: system WebView를 활용함으로써 zero-native 앱은 번들된 런타임의 오버헤드를 피하고, Electron에 비해 디스크 점유량과 메모리 사용량이 크게 감소합니다.
- 유연한 웹 엔진: system WebView가 경량 앱의 기본값이지만, 픽셀 단위의 렌더링 일관성이 필요한 경우 CEF(Chromium Embedded Framework)를 통해 Chromium을 번들링할 수 있습니다.
- 빠른 반복: 프레임워크는 Zig의 빠른 컴파일 속도를 활용합니다. 개발자는 브리지 명령이나 시스템 통합을 수정하고 몇 초 안에 결과를 확인할 수 있으며, 프론트엔드는 기존 웹 핫 리로드의 이점을 그대로 누릴 수 있습니다.
- 원활한 C 통합: Zig의 가장 큰 강점 중 하나는 C 라이브러리를 직접 호출할 수 있다는 점입니다. zero-native는 이를 물려받아 복잡한 바인딩 생성기나 "unsafe" 래퍼 없이도 C 헤더를 포함하고 네이티브 SDK, 오디오 코덱, 혹은 ML 런타임을 호출할 수 있게 합니다.
"Bridge"와 앱 모델
웹 UI를 데스크톱 앱으로 기능하게 만들기 위해 zero-native는 Bridge를 구현합니다. 이를 통해 WebView에서 실행되는 JavaScript가 네이티브 Zig 코드와 직접 통신할 수 있습니다. 이 양방향 통신은 웹 개발자가 파일 시스템 접근이나 하드웨어 연동과 같은 시스템 수준 작업을 트리거할 수 있게 하며, 이는 일반 브라우저 환경에서는 불가능합니다.
프레임워크는 또한 내장 명령, 대화 상자, 시스템 트레이 지원을 제공하여 "native" 느낌이 처음부터 개발자의 워크플로에 통합되도록 합니다.
커뮤니티 논쟁: "Native"란 무엇인가?
새로운 시스템 도구가 등장하면 언제나 그렇듯, zero-native는 Hacker News를 중심으로 개발자 커뮤니티에서 활발한 논쟁을 촉발했습니다. 대부분의 논의는 "native app"의 정의에 초점을 맞추고 있습니다.
정의 충돌
몇몇 비평가들은 WebView를 사용한다는 이유만으로(시스템 제공이든 번들링이든) "native"가 아니라고 주장합니다. 이 관점에서 네이티브 앱은 OS 프리미티브(예: SwiftUI 또는 WinForms)를 사용해 UI를 그리는 앱을 의미합니다.
"I don’t like calling webview dependent applications 'native desktop apps'. Native desktop apps means using the OS primitives and directives to draw the UI imo."
Tauri와의 비교
관찰자들은 zero-native와 Tauri 사이의 놀라운 유사성을 지적했습니다. Tauri 역시 시스템 WebView와 Rust 기반 백엔드를 사용합니다. 이로 인해 Zig와 Rust 사이의 트레이드오프에 대한 논의가 이어졌습니다. zero-native는 Zig의 단순함과 빌림 검사기(borrow checker)의 부재를 강조해 개발 속도를 높이지만, 일부 시스템 프로그래머는 이를 단점으로 보기도 합니다.
"Tauri, but without the memory safety, funding, governance model, or human maintainers."
플랫폼 별 우려
크로스 플랫폼 기반이라는 약속은 매력적이지만, 일부 사용자는 "system WebView"가 상황에 따라 달라지는 용어라고 지적했습니다. 예를 들어 Linux에서는 WebKitGTK에 의존하는 것이 Chromium 기반 대안에 비해 최적의 경험이 아니라고 여겨집니다.
최종 생각
zero-native는 데스크톱에서 웹 기반 UI를 배포하는 보다 효율적인 방식을 제시합니다. 무거운 Node.js/Chromium 번들을 가벼운 Zig 백엔드와 시스템 제공 렌더러로 교체함으로써, 웹의 민첩성을 유지하면서 Electron의 자원 오버헤드를 피하고자 하는 개발자에게 매력적인 대안을 제공합니다. "native" 앱이 무엇인지에 대한 철학적 논쟁은 계속되겠지만, 기술적 목표는 명확합니다: 데스크톱 소프트웨어 배포 비용을 낮추는 것입니다.