본문으로 건너뛰기
피드

Deno, 웹 프로젝트를 데스크톱 앱으로 묶는 `deno desktop` 공개

frontend 약 9분
vote
0
댓글
북마크

Deno가 TypeScript 파일 하나부터 Next.js 앱까지 데스크톱 앱으로 패키징하는 `deno desktop`을 공개했다. 아직 안정 릴리스는 아니고 Deno v2.9.0 canary에서만 쓸 수 있지만, 운영체제 WebView 기반의 작은 바이너리, 프레임워크 자동 감지, 내장 자동 업데이트까지 한 번에 노린다.

  • 1

    `deno desktop`은 코드, Deno 런타임, 웹 렌더링 엔진을 플랫폼별 재배포 바이너리 하나로 묶는다.

  • 2

    기본은 OS 내장 WebView를 써서 작게 가고, 렌더링 일관성이 필요하면 CEF 기반 Chromium 번들을 선택할 수 있다.

  • 3

    Next.js, Astro, Fresh, Remix, Nuxt, SvelteKit, SolidStart, Vite SSR 등 주요 웹 프레임워크를 자동 감지한다.

  • 4

    UI와 Deno 백엔드는 소켓 기반 IPC가 아니라 인프로세스 바인딩으로 통신한다.

  • 5

    `latest.json` 매니페스트와 `bsdiff` 패치 기반의 바이너리 차분 자동 업데이트를 런타임이 처리한다.

  • Deno가 deno desktop을 공개함. 한 줄로 말하면 Deno 프로젝트를 플랫폼별 데스크톱 앱 바이너리로 묶어주는 기능임.

    • 대상은 꽤 넓음. TypeScript 파일 하나짜리 앱부터 Next.js 같은 풀스택 웹 프로젝트까지 포함됨.
    • 결과물에는 앱 코드, Deno 런타임, 웹 렌더링 엔진이 함께 들어감.
    • macOS, Windows, Linux용으로 각각 재배포 가능한 바이너리를 만드는 그림임.
  • 단, 지금 당장 안정 버전 기능은 아님. Deno v2.9.0 canary에 들어간 상태임.

    • 써보려면 deno upgrade canary로 canary 빌드를 설치해야 함.
    • CLI 명령, 설정 키, TypeScript API는 안정화 전까지 바뀔 수 있다고 못 박아둠.
    • 실서비스 빌드 파이프라인에 바로 박아 넣기보다는, 지금은 구조와 방향성을 보는 단계에 가까움.

중요

> deno desktop은 아직 stable 기능이 아님. 문서상으로도 명령어와 API가 바뀔 수 있다고 명시돼 있어서, 프로덕션 의존성으로 고정하기엔 이른 상태임.

  • Deno가 노리는 포지션은 꽤 명확함. Electron, Tauri, Electrobun 계열의 장단점을 다시 조합하겠다는 쪽임.

    • Electron은 웹 기술을 그대로 쓰기 좋지만 바이너리가 크다는 이미지가 강함.
    • Tauri류는 작은 바이너리를 노리지만 생태계나 플랫폼 지원, 업데이트, 프레임워크 연동에서 신경 쓸 게 생김.
    • Deno는 “작게 시작하되 npm 생태계와 Node 호환성은 가져간다”는 식으로 각을 잡음.
  • 기본 렌더링 백엔드는 운영체제 내장 WebView를 씀. 그래서 기본값은 작은 바이너리를 지향함.

    • macOS, Windows, Linux에 이미 있는 웹뷰를 활용하는 방식이라 Chromium 전체를 매번 들고 다니는 구조가 아님.
    • 그래도 npm 생태계는 Deno의 Node 호환 레이어를 통해 쓸 수 있다고 설명함.
    • 반대로 모든 플랫폼에서 동일한 렌더링 결과가 중요하면 CEF 기반 Chromium 백엔드를 선택할 수 있음.
  • 웹 프레임워크 자동 감지가 꽤 공격적임. 기존 웹앱을 데스크톱으로 가져가는 흐름을 정면으로 겨냥함.

    • 문서에 언급된 대상은 Next.js, Astro, Fresh, Remix, Nuxt, SvelteKit, SolidStart, TanStack Start, Vite SSR 등임.
    • release 모드에서는 프로덕션 서버를 실행하고, 개발 모드에서는 --hmr로 dev server와 hot reload를 붙임.
    • 핵심은 “기존 웹 프로젝트를 바꾸지 않고 desktop으로 돌린다”는 주장임. 이게 진짜 잘 되면 내부툴이나 개발자용 앱 만들 때 꽤 편해짐.
  • UI와 백엔드 통신도 흥미로운 지점임. 소켓 기반 IPC 대신 인프로세스 바인딩을 쓴다고 함.

    • WebView에서 bindings.<name>() 형태로 Deno 코드를 호출하는 모델이 문서에 등장함.
    • 값은 경계를 넘을 때 여전히 인코딩되지만, 별도 프로세스 사이를 왕복하는 구조는 아니라는 게 포인트임.
    • 데스크톱 웹앱에서 자주 나오는 “프론트와 백엔드 사이 호출 비용”을 줄이려는 설계로 읽힘.
  • 가장 작은 예제는 진짜 작음. Deno.serve()로 HTML을 반환하고 deno desktop main.ts를 실행하면 창이 뜸.

    • 예제는 new Response("<h1>Hello, desktop</h1>")를 반환하는 단일 파일 앱임.
    • 컴파일된 바이너리는 로컬 HTTP 서버를 가리키는 창을 열고, 사용자는 ./main 또는 Windows의 main.exe를 실행하면 됨.
    • Deno.serve()가 WebView가 이동하는 주소에 자동으로 바인딩되기 때문에 포트나 호스트를 직접 넘기지 않아도 된다고 설명함.
  • 배포 쪽 기능도 단순 패키징에서 끝나지 않음. 자동 업데이트를 런타임 레벨에서 제공하려는 게 큼.

    • latest.json 매니페스트 하나와 bsdiff 패치를 배포하면 런타임이 polling, patch 적용, 실패한 실행 후 rollback까지 처리하는 구조임.
    • 데스크톱 앱에서 업데이트는 늘 귀찮은 부분인데, 이걸 기본 스토리로 넣겠다는 건 꽤 실용적임.
    • Electron 앱이든 Tauri 앱이든 업데이트 파이프라인에서 삽질한 팀이면 이 부분에 바로 눈이 갈 만함.

💡

> 기존 Next.js나 SvelteKit 앱을 내부 데스크톱 도구로 감싸고 싶은 팀이라면, 안정화 이후 deno desktop이 꽤 현실적인 후보가 될 수 있음. 특히 자동 업데이트와 프레임워크 감지가 실제로 잘 맞물리는지가 관건임.

  • 문서상 기능 범위는 데스크톱 앱에서 기대하는 기본 부품을 꽤 많이 포함함.

    • 창 생명주기와 다중 창은 Deno.BrowserWindow 쪽에서 다룸.
    • 애플리케이션 메뉴, 컨텍스트 메뉴, 트레이, macOS dock, 네이티브 dialog도 범위에 들어감.
    • prompt(), alert(), confirm()을 네이티브 팝업으로 연결하고, Web Notification API로 OS 알림도 보낼 수 있음.
    • Deno 런타임과 WebView 양쪽에 붙는 통합 DevTools, 에러 리포팅, installer와 output format까지 문서 섹션이 잡혀 있음.
  • 결론적으로 deno desktop은 “Deno로 Electron 대체재 하나 더 나왔네” 정도로 넘기기엔 조금 더 야심이 큼.

    • 작은 기본 바이너리, npm 호환성, 웹 프레임워크 자동 감지, 인프로세스 바인딩, 크로스 컴파일, 자동 업데이트를 한 묶음으로 제시함.
    • 아직 canary라 당장 승부가 난 건 아니지만, Deno가 서버 런타임을 넘어 앱 배포 런타임으로 확장하려는 신호로 보기엔 충분함.
    • 한국 개발자 입장에선 웹 기술로 사내툴, 운영툴, 개발자용 GUI를 만드는 팀들이 특히 체크할 만한 뉴스임.

기술 맥락

  • 여기서 Deno가 고른 핵심 선택은 기본값을 OS WebView로 두는 거예요. 왜냐하면 데스크톱 웹앱에서 가장 많이 까이는 지점이 바이너리 크기인데, Chromium을 기본으로 번들링하면 시작부터 Electron과 비슷한 부담을 안고 가거든요.

  • 대신 CEF 백엔드를 옵션으로 남긴 것도 중요해요. WebView는 작고 편하지만 운영체제별 렌더링 차이가 생길 수 있어서, 화면 일관성이 제품 요구사항이면 Chromium을 앱에 포함하는 쪽이 더 맞을 수 있어요.

  • 프레임워크 자동 감지는 기존 웹앱을 거의 그대로 데스크톱으로 가져오려는 선택이에요. Next.js, Astro, Remix, Nuxt, SvelteKit 같은 프로젝트를 감지해서 release에서는 production server, 개발 중에는 --hmr dev server를 돌리기 때문에 마이그레이션 비용을 줄이려는 의도가 보여요.

  • 인프로세스 바인딩은 UI와 백엔드 사이 호출 구조를 단순하게 만들기 위한 장치예요. 소켓 기반 IPC처럼 프로세스를 오가며 통신하는 모델보다 호출 경로가 짧아서, Deno 코드와 WebView가 자주 대화하는 앱에서 체감 차이가 날 수 있어요.

  • 자동 업데이트를 latest.jsonbsdiff 기반으로 넣은 건 배포 운영까지 런타임이 책임지겠다는 뜻이에요. 데스크톱 앱은 설치보다 업데이트가 더 까다로운 경우가 많아서, 실패 시 rollback까지 기본 흐름에 넣은 점이 개발팀 입장에선 꽤 큰 차이예요.

Electron의 무거움과 Tauri의 러닝커브 사이에서 Deno식 답을 내놓은 느낌이다. 아직 canary라 실서비스 투입은 이르지만, 웹앱을 데스크톱으로 가져가는 팀이라면 꽤 눈여겨볼 만하다.

댓글

댓글

댓글을 불러오는 중...

frontend

파비콘 안에 웹사이트를 숨겨 넣은 개발자, 진짜 됨

한 개발자가 웹사이트의 파비콘 이미지를 작은 저장소처럼 사용해 HTML을 픽셀 RGB 값 안에 넣고, 브라우저에서 다시 읽어 렌더링하는 실험을 했다. 208바이트짜리 HTML payload에 4바이트 길이 헤더를 붙여 총 212바이트를 만들었고, 이를 9x9 픽셀 PNG 안에 87% 사용률로 저장했다.

frontend

스크린이 절대 못 보여주는 색은 어디에 있을까

이 글은 우리가 화면에서 보는 색이 인간이 볼 수 있는 색 전체가 아니라, sRGB와 Display-P3 같은 색역 안에 갇힌 일부라는 점을 파고든다. 특히 숲, 바닷속, 새와 나비의 구조색, 생물발광, 교통신호 LED 같은 실제 세계에는 모니터와 카메라가 제대로 담지 못하는 청록색과 녹색 계열이 꽤 많다는 얘기다. 디스플레이, 카메라, 조명, 렌더링을 다루는 개발자라면 “색상값 하나”가 생각보다 물리와 표준의 타협이라는 걸 체감하게 된다.

frontend

크롬, 매니페스트 버전 2 우회로까지 닫는다

구글 크롬이 매니페스트 버전 2 확장 지원을 사실상 최종 종료 단계로 밀어넣고 있다. 기존에는 플래그나 레지스트리 설정으로 유블록 오리진 같은 확장을 살리는 우회가 있었지만, 크로미움 150과 151을 거치며 그 우회 코드까지 제거되는 흐름이다.

frontend

HTML 우선 사이트로 전환했더니 신청 완료자가 하룻밤 사이 2배가 된 이야기

한 공공성 강한 유틸리티 회사가 React 기반 신청 폼 실패 뒤, Astro와 HTML 우선 구조로 다시 만들었더니 폼 완료자가 출시 직후 2배로 늘어남. 핵심은 자바스크립트 없이도 동작하는 페이지별 폼, 서버 저장 세션, 접근성, 점진적 향상이었음.

frontend

Linear가 빠른 이유? 브라우저 안에 DB를 넣고 서버를 ‘동기화 대상’으로 밀어낸 설계

Linear의 속도는 특정 프레임워크나 마법 같은 최적화가 아니라, 브라우저 로컬 DB, 낙관적 업데이트, 세밀한 MobX 반응성, 공격적인 코드 스플리팅, 서비스 워커 캐싱, 키보드 중심 UX가 쌓인 결과다. 전통적인 CRUD 앱이 이슈 업데이트에 약 300ms를 쓰는 동안 Linear는 사용자가 체감하기 전에 로컬 상태를 먼저 바꾸고 서버와는 나중에 맞춘다.