Deno 2.9: 네이티브 애플리케이션을 위한 deno desktop 소개
Deno 2.9: 네이티브 애플리케이션을 위한 deno desktop 소개
Deno 2.9는 단일 TypeScript 파일부터 Next.js와 같은 풀스택 프레임워크에 이르기까지 Deno 프로젝트를 독립적이고 재배포 가능한 데스크톱 바이너리로 변환하는 새로운 명령인 deno desktop을 도입합니다. 이 도구는 애플리케이션 코드, Deno 런타임, 그리고 웹 렌더링 엔진을 하나의 플랫폼별 실행 파일로 번들링합니다.
deno desktop의 핵심 기능
deno desktop은 번들링, 렌더링 및 업데이트를 처리하는 고도로 통합된 툴체인을 제공하여 데스크톱 애플리케이션 구축의 마찰을 줄이는 것을 목표로 합니다.
유연한 렌더링 백엔드
개발자는 바이너리 크기와 일관성 사이의 균형을 맞추기 위해 두 가지 주요 렌더링 전략 중에서 선택할 수 있습니다:
- OS WebView (기본값): 바이너리 크기를 작게 유지하기 위해 운영 체제의 네이티브 webview를 사용합니다.
- Chromium (CEF): macOS, Windows, Linux 전반에서 동일한 렌더링을 보장하기 위해 Chromium Embedded Framework (CEF)를 번들링합니다.
프레임워크 자동 감지
deno desktop은 인기 있는 웹 프레임워크에 대한 내장 지원을 포함합니다. 다음 항목들을 자동으로 감지하고 구성합니다:
- Next.js, Astro, Fresh, Remix, Nuxt, SvelteKit, SolidStart, TanStack Start, 그리고 Vite SSR.
릴리스 모드에서는 프로덕션 서버를 실행하며, 개발 중에는 원래의 웹 프로젝트에 코드 변경 없이 핫 모듈 교체(hot module replacement)를 위한 --hmr 플래그를 지원합니다.
프로세스 내 통신 (In-Process Communication)
일반적으로 소켓 기반의 프로세스 간 통신(IPC)에 의존하는 Electron이나 Tauri와 달리, deno desktop은 백엔드와 UI 사이의 통신을 위해 프로세스 내 채널을 사용합니다. 호출 경계를 넘을 때 값은 여전히 인코딩되지만, 이 아키텍처는 프로세스 간 왕복 오버헤드를 제거합니다.
교차 플랫폼 컴파일 및 업데이트
- 단일 머신 빌드: 백엔드는 로컬에서 빌드하는 대신 필요에 따라 다운로드되므로, 개발자는 단일 머신에서 macOS, Windows, Linux를 위해 컴파일할 수 있습니다.
- 바이너리-Diff 자동 업데이트: 런타임은
Deno.autoUpdate()를 사용하는 내장 업데이트 시스템을 포함합니다.latest.json매니페스트와 bsdiff 패치를 사용하여 업데이트를 확인하고, 적용하며, 실패한 업데이트를 자동으로 화복(roll back)합니다.
기술적 구현 및 API
기본적인 데스크톱 애플리케이션을 만드는 데는 최소한의 설정이 필요합니다. main.ts 파일의 간단한 Deno.serve() 핸들러는 deno desktop main.ts 명령을 사용하여 바이너리로 변환될 수 있습니다.
통합 기능
deno desktop은 포괄적인 네이티브 API 및 구성 세트를 제공합니다:
- 창 관리:
Deno.BrowserWindow는 여러 창의 라이프사이클과 이벤트를 처리합니다. - 네이티브 UI 요소: 애플리케이션 및 컨텍스트 메뉴, 시스템 트레이 아이콘, 그리고 macOS dock 통합을 지원합니다.
- OS 통합:
prompt(),alert(),confirm()을 위한 네이티브 팝업, 그리고 Web Notification API를 통한 네이티브 OS 알림을 지원합니다. - 개발자 도구: Deno 런타임과 webview에 동시에 연결되는 통합 DevTools를 제공합니다.
커뮤니티 관점 및 분석
발표 이후, 개발자 커뮤니티는 deno desktop 아키텍처에 관한 몇 가지 전략적 이점점과 잠재적인 우려 사항을 강조했습니다.
기존 프레임워크와의 비교
일부 사용자들은 deno desktop이 작은 바이너리 크기를 위해 네이티브 WebView를 사용하는 Tauri의 아키텍처를 반영하지만, 비즈니스 로직을 위해 Rust 대신 TypeScript를 사용한다는 점에 주목했습니다.
"Tauri와 유사한 아키텍처처럼 들리지만, 비즈니스 로직이 Rust 대신 TypeScript로 되어 있군요."
다른 사용자들은 타입을 제거하지 않고 실제 TypeScript를 직접 실행할 수 있는 능력이 Deno를 Node 기반의 대안들보다 경쟁 우위에 있게 만든다고 주장했습니다.
보안 및 권한
컴파일된 바이너리의 맥락에서 Deno의 권한 시스템에 대한 질문이 제습니다기되었습니다. 현재, 컴파일 시 부여된 권한은 바이너리에 포함됩니다.
UI 및 UX 우려 사항
비평가들은 데스크톱 UI를 위해 웹 기술에 의존하는 것이, 사용되는 runtime이 무엇이든 관계없이 네이티브 OS 디자인 패턴을 따르지 못하는 애플리케이션으로 이어지는 경우가 많다고 지적했습니다.
"Electron 앱이 많은 비난을 받는 이유는 그것이 UI 툴킷이라기보다는 그 외의 모든 것이기 때문입니다. 호스트 OS의 UI 패턴을을 채택하는 데 있어 지속적으로 목표를 놓치고 있습니다."
성능 및 리소스 관리
CEF 기반 앱의 바이너리 크기에 대한 지속적인 논의가 있습니다. 애플리케이션 간에 공유 CEF 런타임을 사용하여 앱당 수백 메가바이트에서 수 메가바이트로 크기를 줄이는 로드맵 항목이 제안되었습니다.