Orbis: Rust와 React를 사용한 플러그인 기반 데스크톱 플랫폼 구축

발행: (2025년 12월 28일 오후 12:40 GMT+9)
10 min read
원문: Dev.to

Source: Dev.to

기존 플러그인 시스템의 고통

  • 익숙하지 않은 환경 – 모든 플랫폼마다 고유한 API, 특이점, 제한 사항이 있습니다.
  • UI는 어렵다 – 제한된 UI 기본 요소만 제공되거나 또 다른 프레임워크를 배워야 합니다.
  • 보안은 사후 고려사항 – 대부분의 플러그인 시스템은 플러그인 코드를 암묵적으로 신뢰합니다.
  • 상태 관리가 엉망이 된다 – 플러그인 상태와 호스트‑애플리케이션 상태를 조정하는 것이 악몽입니다.

나는 이러한 모든 문제를 성능을 희생하지 않고 해결하고 싶었고, 답은 Rust였습니다.

급진적인 아이디어: 플러그인은 React 코드가 아니라 JSON 스키마를 제공합니다

{
  "type": "Container",
  "children": [
    {
      "type": "Heading",
      "level": 1,
      "text": "Hello, {{state.username}}!"
    },
    {
      "type": "Button",
      "label": "Count: {{state.clicks}}",
      "events": {
        "onClick": [
          {
            "type": "updateState",
            "path": "clicks",
            "value": "{{state.clicks + 1}}"
          }
        ]
      }
    }
  ]
}

그게 전부입니다. JSX도, 번들러도, 프레임워크 락인도 없습니다. Orbis 코어가 이 스키마를 해석해 shadcn/ui를 사용해 프로덕션 수준의 React 컴포넌트를 렌더링합니다.

제어된 액션 시스템

플러그인은 임의의 JavaScript를 제공할 수 없기 때문에 임의의 JavaScript를 실행할 수도 없습니다. 모든 상호작용은 제어된 액션 시스템을 통해 이루어집니다:

  • API 호출이 필요합니까? call_api 액션을 사용하세요.
  • 페이지 이동이 필요합니까? navigate 액션을 사용하세요.

코어는 실행 전에 모든 액션을 검증합니다.

일관되고 네이티브한 UI

모든 플러그인은 동일한 컴포넌트 라이브러리를 통해 렌더링되므로 UI 불일치(예: 한 플러그인은 Material Design을 사용하고 다른 플러그인은 Bootstrap을 사용하는 경우) 문제가 사라집니다.

플러그인을 만들기 위해 프론트엔드 개발자가 될 필요는 없습니다.
JSON(또는 향후 우리의 커스텀 DSL)을 작성할 수 있다면 UI를 만들 수 있습니다.

계층형 아키텍처

┌─────────────────────────────────────────────────┐
│                 User Interface                  │
│              (Plugin Pages & UI)                │
├─────────────────────────────────────────────────┤
│              Frontend Layer                     │
│   Schema Renderer │ Zustand State │ Actions     │
├─────────────────────────────────────────────────┤
│               Backend Layer                     │
│   Tauri Commands │ Plugin Runtime │ Auth        │
├─────────────────────────────────────────────────┤
│              Plugin System                      │
│   WASM Sandbox │ Manifests │ UI Schemas        │
├─────────────────────────────────────────────────┤
│              Storage Layer                      │
│   SQLite │ PostgreSQL                           │
└─────────────────────────────────────────────────┘

프론트엔드

  • React 로 구축되었습니다.
  • 상태 관리를 위해 Zustand 를 사용합니다.
  • 플러그인 페이지당 격리된 상태 – 전역 상태 오염이 없습니다.
// Simplified: each page gets its own isolated state store
const pageStore = createPageStateStore({
  username: "Guest",
  clicks: 0
});

백엔드

  • 데스크톱 래퍼로 Tauri, HTTP 서버로 Axum 을 사용한 순수 Rust.
  • 장점:
    • 네이티브 성능 – Electron 부하가 없습니다.
    • 메모리 안전성 – Rust 의 보장이 플러그인까지 확장됩니다.
    • 크로스 플랫폼 – 하나의 코드베이스로 Windows, macOS, Linux 를 지원합니다.

WASM 샌드박싱

플러그인은 WASM 으로 컴파일되어 wasmtime 샌드박스에서 실행되며, 다음을 제공합니다:

  • 권한 없이는 파일 시스템 접근이 불가능합니다.
  • 권한 없이는 네트워크 요청이 불가능합니다.
  • 호스트 애플리케이션에 영향을 주는 충돌이 발생하지 않습니다.
  • 격리된 메모리 공간.

내장 UI 구성 요소

기본 제공으로 Orbis는 다음을 제공합니다:

  • Layout Components
  • Form Components
  • Display Components
  • Interactive Components

각 항목은 잘 테스트된 shadcn/ui 구현에 매핑되어 접근성, 키보드 탐색 및 최신 UI 패턴을 무료로 제공합니다.

액션 – 플러그인이 세상과 상호작용하는 방법

{
  "type": "call_api",
  "api": "users.list",
  "method": "GET",
  "onSuccess": [
    {
      "type": "update_state",
      "path": "users",
      "value": "{{$response.body.data}}"
    }
  ]
}

사용 가능한 액션

ActionDescription
update_state페이지 상태 수정
call_apiHTTP 요청 수행
navigate라우트 변경
show_toast토스트 알림 표시
show_dialog / close_dialog모달 처리
validate_form / reset_form폼 상태 관리
conditionalif/else 로직
곧 더 많은 기능 제공

Storage Options

  • Single‑user desktop apps – embedded SQLite (zero external dependencies).
  • Multi‑user apps – connect to a central Orbis server with PostgreSQL backend, full authentication, session management, etc.

보안 – 기본에 내장, 추가가 아님

  • 보안 인증 – Argon2 비밀번호 해싱을 사용한 JWT 토큰.
  • 세션 관리 – 리프레시 토큰을 사용한 안전한 처리.
  • WASM 샌드박싱 – 격리된 플러그인 실행.
  • TLS 지원rustls를 이용한 선택적 HTTPS (OpenSSL이나 기타 시스템 의존성 없음).

로드맵

마일스톤설명
플러그인 마켓플레이스한 번의 클릭으로 플러그인을 검색하고 설치
플러그인 간 통신플러그인 간 보안 메시지 전달
커스텀 DSL페이지 정의를 위한 JSON보다 깔끔한 구문
전체 GUI 오버라이드플러그인이 기본 UI를 완전히 대체하도록 허용
자동 업데이트원활한 업데이트를 위해 Tauri 내장 업데이트 기능 활용
파이프라인에 더 많은 기능 예정

업데이트

다가오는 기능에 대한 전체 로드맵 확인하기

리포지토리 복제

git clone https://github.com/cyberpath-HQ/orbis
cd orbis

프론트엔드 종속성 설치

cd orbis && bun install

개발 모드에서 실행

bun run tauri dev

첫 번째 플러그인은 이렇게 간단할 수 있습니다

{
  "name": "hello-world",
  "version": "0.1.0",
  "pages": [
    {
      "id": "main",
      "title": "Hello World",
      "route": "/hello",
      "state": {
        "message": { "type": "string", "default": "Hello, Orbis!" }
      },
      "layout": {
        "type": "Container",
        "children": [
          {
            "type": "Heading",
            "text": "{{state.message}}"
          }
        ]
      }
    }
  ]
}

왜 Rust인가?

Rust를 선택한 것은 임의가 아니었습니다. 성능 이점 외에도, Rust의 소유권 모델은 다음을 보장합니다:

  • 플러그인 런타임에서 데이터 레이스가 발생하지 않음
  • 예측 가능한 메모리 사용량
  • 플러그인 실행을 위한 두려움 없는 동시성
  • 다른 곳에서는 런타임 오류가 될 수 있는 문제를 컴파일 타임에 보장

게다가 WASM을 위한 Rust 생태계는 성숙했습니다:

  • Wasmtime – 검증된 샌드박스
  • Tauri – 가벼운 데스크톱 래퍼
  • Axum – 빠른 비동기 HTTP 서버

Orbis가 제공하는 것

Orbis는 확장 가능한 데스크톱 애플리케이션에 대한 새로운 접근 방식을 제공합니다. what(JSON 스키마)와 how(React 렌더링)를 분리함으로써 우리는 다음과 같은 플랫폼을 만들었습니다:

  • 플러그인 개발자는 프레임워크의 특이점이 아니라 기능에 집중합니다
  • 사용자는 일관되고, 안전하며, 아름다운 애플리케이션을 얻습니다
  • 핵심 팀은 플러그인을 깨뜨리지 않고 렌더링 레이어를 발전시킬 수 있습니다

데스크톱 애플리케이션을 확장해야 하는 경우—내부 도구이든, 개발자 유틸리티이든, 완전한 제품이든—Orbis를 사용해 보세요.

리소스

이 내용이 흥미로우셨다면, Rust, 보안, 그리고 개발자 도구에 대한 더 깊은 탐구를 위해 팔로우해주세요. 그리고 Orbis로 무언가를 만들었다면, 꼭 보여주세요!

Back to Blog

관련 글

더 보기 »