Rust — Tauri 가 Rust 인 이유
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 장 요약):
- 모든 값은 소유자 (owner) 가 정확히 하나.
- 소유자가 스코프를 벗어나면 값은 즉시 해제.
- 값은 빌릴 수 있음 (
&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 가 이 자리에 잘 어울리는 이유:
- 작은 바이너리 — GC 런타임이 없고 정적 링크가 자연스러워 출시 바이너리가 수 MB 단위로 작게 (Electron 은 Chromium 을 함께 묶어 100 MB 이상이 흔함).
- OS API 직접 접근 — Win32 · Cocoa · GTK · Android NDK · iOS objc-c 인터페이스를 안전한 래퍼로 (
windows-rs·core-foundation·jni-rs등). - 데이터 경합 없는 동시성 — 멀티스레드 IPC · 파일 I/O · OS 이벤트 처리에서 컴파일러가 안전성을 보장.
- C / C++ 라이브러리 재사용 — 네이티브 SQLite · libsodium · OpenSSL 같은 라이브러리를 FFI 로 그대로.
- 공급망 보안 — 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 를 참고합니다.