codingstairs
노트에듀라이프연락
⌕검색⌘K
koen

Navigation

  • Intro
  • Blog
  • Life

연락하기

로그인 없이도 보낼 수 있어요. 답변이 필요하면 이메일을 함께 적어 주세요.

  • 익명 폼으로 의견 남기기 →
  • ✉ warragon112@gmail.com
  • 카카오톡 오픈채팅 ↗

© 2026 codingstairs

  • 노트
  • 에듀
  • 검색
  • 라이프
  • 연락
  • 약관
  • RSS
  • GitHub
노트›languages

Rust — Tauri 가 Rust 인 이유

2026-04-28 게시· 2026-05-18 갱신·0회 조회

Rust — Tauri 가 Rust 인 이유

Tauri 는 데스크탑 · 모바일 앱을 만드는 프레임워크인데 핵심 런타임이 Rust 로 쓰여 있습니다. 이 글은 Rust 의 출자 · 핵심 개념과 "왜 하필 Rust 였는가" 를 사실 기준으로. Rust 자체를 깊게 배우는 글은 아닙니다.

1. Rust 에 대한 이야기

Mozilla 의 Graydon Hoare 가 2006 년 개인 프로젝트로 시작했고, 2010 년 Mozilla 가 후원하면서 처음 공개. 1.0 은 2015 년 5월. 2021 년 2월 Rust Foundation 이 설립되어 AWS · Google · Huawei · Microsoft · Mozilla 가 창립 멤버로 참여, 이후 언어와 도구의 관리 주체가 재단으로. 라이선스는 MIT / Apache-2.0 이중.

설계 목표 — 메모리 안전 · 동시성 안전 · 추상화에 따른 런타임 비용 없음 (zero-cost abstraction). GC 없이도 메모리 안전을 제공하기 위해 소유권 시스템 을 컴파일러가 정적으로 검사.

2. Ownership · Borrow · Lifetime

핵심 규칙 (공식 The Rust Programming Language 4 장 요약):

  1. 모든 값은 소유자 (owner) 가 정확히 하나.
  2. 소유자가 스코프를 벗어나면 값은 즉시 해제.
  3. 값은 빌릴 수 있음 (&T 불변 참조 · &mut T 가변 참조). 같은 시점에 가변 참조는 하나만, 또는 불변 참조 여러 개 만 허용.
fn main() {
    let s = String::from("hello");
    let len = take_len(&s);     // 빌려줌
    println!("{s} {len}");      // 여전히 사용 가능
}

fn take_len(s: &String) -> usize { s.len() }

소유권을 옮기면 (move) 원본은 더 이상 사용할 수 없음. 컴파일러가 거부.

라이프타임 (lifetime) 은 참조가 살아 있는 구간을 컴파일러에 알려주는 표기. 대부분 추론되지만 함수 시그니처에서 명시가 필요할 때:

fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    if x.len() > y.len() { x } else { y }
}

이 규칙들 덕분에 데이터 경합 (data race) 이 컴파일러에서 막힘. C / C++ 에서 흔한 use-after-free · double-free · 동시 변경 같은 문제가 빌드 단계에서.

3. 결과

  • GC 없음 — 일시정지 (GC pause) 가 없고, 임베디드 · 실시간 · OS 커널까지 후보.
  • 단일 정적 바이너리 — cargo build --release 가 의존성을 정적으로 묶은 실행 파일 (필요 시 동적 링크도 가능).
  • C ABI 호환 — C 라이브러리를 그대로 부르고, C 가 부를 수 있는 .so / .dll / .dylib 을 만들 수 있음.

4. Cargo

Rust 의 빌드 · 패키지 도구. 한 도구가 다음을 모두:

  • 의존성 해결 (Cargo.toml · Cargo.lock)
  • 빌드 · 테스트 · 문서 생성 (cargo build · test · doc)
  • 워크스페이스 (모노레포 모드)
  • crate 게시 (crates.io)

JS 의 npm, Python 의 uv 같은 자리를 한 번에.

5. 다른 길 (시스템 언어 선택지)

언어 첫 릴리스 위치
C 1972 시스템 · OS · 드라이버. 표준 ABI.
C++ 1985 C 의 상위 집합 + 객체지향 · 템플릿.
Go 2009 (Google) GC 가 있는 시스템급 언어. 단순성 · 동시성 모델 (고루틴) 강조.
Rust 2010 · 1.0 2015 GC 없는 메모리 안전.
Zig 2016, Andrew Kelley 명시적 메모리 관리 · comptime. C 와 매끄러운 통합 강조.
Swift 2014, Apple ARC 기반. 주로 Apple 플랫폼.

선택은 트레이드오프. Go 는 학습 곡선이 완만하고 GC 가 있음. Rust 는 안전성 보증이 강하지만 학습 곡선이 높음. Zig 는 더 단순한 컴파일러 · comptime 메타프로그래밍을 강조.

6. Tauri 가 Rust 인 이유

Tauri 는 2020 년 첫 공개된 데스크탑 · 모바일 앱 프레임워크. 1.0 은 2022 년 6월, 2.0 은 2024 년 10 월. 라이선스는 MIT / Apache-2.0.

핵심 아키텍처 — WebView 호스트 + Rust 코어:

  • UI 레이어 — 시스템에 이미 깔린 WebView 를 띄워 HTML / CSS / JS 를 렌더 (Windows 의 WebView2 · macOS 의 WKWebView · Linux 의 WebKitGTK).
  • 코어 레이어 — Rust 가 창 관리 · 이벤트 루프 · OS API 호출 · 번들링.
  • 다리 — #[tauri::command] 로 노출된 Rust 함수를 JS 에서 invoke("name", args) 로.

Rust 가 이 자리에 잘 어울리는 이유:

  1. 작은 바이너리 — GC 런타임이 없고 정적 링크가 자연스러워 출시 바이너리가 수 MB 단위로 작게 (Electron 은 Chromium 을 함께 묶어 100 MB 이상이 흔함).
  2. OS API 직접 접근 — Win32 · Cocoa · GTK · Android NDK · iOS objc-c 인터페이스를 안전한 래퍼로 (windows-rs · core-foundation · jni-rs 등).
  3. 데이터 경합 없는 동시성 — 멀티스레드 IPC · 파일 I/O · OS 이벤트 처리에서 컴파일러가 안전성을 보장.
  4. C / C++ 라이브러리 재사용 — 네이티브 SQLite · libsodium · OpenSSL 같은 라이브러리를 FFI 로 그대로.
  5. 공급망 보안 — cargo + crates.io 의 잠금 파일 모델이 npm 의 호이스팅 위험과 다르다는 점이 자주.

이 선택의 대가도 있음. 학습 곡선이 가파르고, 동적 플러그인 모델은 더 어려움. Tauri 는 이 어려움을 플러그인 시스템 (tauri-plugin-*) 과 권한 (capabilities) 모델로 흡수.

7. 자주 쓰는 모양

설치:

# Windows (PowerShell · winget)
winget install Rustlang.Rustup

# macOS · Linux
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# 이후 공통
rustup default stable
rustup update
cargo --version

rustup 이 toolchain 을 관리. 프로젝트별로 rust-toolchain.toml 을 두면 팀이 같은 버전.

Tauri 명령:

pnpm tauri dev          # 개발 빌드 + WebView 실행
pnpm tauri build        # 릴리스 번들

내부에서 cargo build 가 돔. src-tauri/Cargo.toml 이 Rust 쪽 manifest.

명령 노출:

// src-tauri/src/lib.rs
#[tauri::command]
fn add(a: i32, b: i32) -> i32 { a + b }

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .invoke_handler(tauri::generate_handler![add])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}
// 프론트엔드
import { invoke } from "@tauri-apps/api/core"
const sum = await invoke<number>("add", { a: 1, b: 2 })

8. 자주 걸리는 자리

첫 빌드 시간 — cargo 가 의존성 트리를 처음부터 컴파일. 수 분이 흔함. 이후는 증분 빌드.

MSVC vs GNU 툴체인 (Windows) — 기본은 x86_64-pc-windows-msvc 이며 Visual Studio Build Tools 가 필요. rustup default stable-msvc 의 의미를 한 번 짚어둠.

OS 별 WebView 차이 — WebView2 · WKWebView · WebKitGTK 의 CSS · JS 지원 범위가 같지 않음. Linux 가 가장 다르다는 평이 흔함.

unsafe 의 의미 — Rust 의 안전성은 unsafe { ... } 블록 밖에서만 보장. FFI 가 닿는 자리에 격리해 두는 관행.

panic 처리 — Rust 코어에서 panic 이 나면 앱이 종료. Result<T, E> 로 회수하고 명령 핸들러에서는 Result 를 반환해 JS 쪽 catch 로 흘려보냄.

하고픈 말

Rust 의 소유권 시스템은 GC 없이 메모리 안전을 제공하는 새로운 갈래. Tauri 가 Rust 를 코어로 쓴 이유는 작은 바이너리 + OS API 직접 접근 + 데이터 경합 없는 동시성 + C / C++ 재사용 + 공급망 보안 다섯의 결합. 학습 곡선이 가파르지만 그만큼 운영 안정성이 높은 자리. WebView 의 OS 별 차이만 의식하면 데스크탑 + 모바일을 한 코드베이스로.

Next

  • (languages 끝)

Rust 공식 사이트 · The Rust Programming Language (book) · Rust GitHub · Rust Foundation · Tauri 공식 사이트 · Tauri GitHub · Go · Zig 를 참고합니다.

languages 카테고리의 다른 글

카테고리 전체 보기 →
  • Python 과 비동기 (asyncio)
  • Java 21 의 모습
  • TypeScript 와 strict 모드