C.W.K.
Stream
Lesson 02 of 04 · published

결정론은 Rust 로

~11 min · rust, deterministic, file-io, tauri-command

Level 0식은 초고
0 XP0/33 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"같은 입력이 항상 같은 출력을 내야 한다면, Rust 에 속해 — 빠르고, 테스트 가능하고, 절대 추측 안 해."

Rust 코어에 사는 것

봉합선의 결정론적 쪽 모든 게 Rust 코어에 살아. export ruleset 적용 (부활한 WordPress-tag 레이어), frontmatter 와 태그 파싱·쓰기, 파일 읽기/쓰기. 이건 순수 변환이야 — 문서 더하기 ruleset 이 정확히 하나의 출력을, 매번 같게 내. 모델도, 무작위성도, '경우에 따라' 도 없어. 그 속성이 누구한테도 안 묻고 돌려도 안전하게 만드는 거야.

왜 결정론에 Rust 인가

Rust 가 결정론 레이어에 맞는 세 이유. 빠르니까, 파일과 텍스트 변환이 UI 를 안 막아. 안전하니까, 네 파일을 건드리는 레이어가 메모리 버그로 그걸 안 망가뜨려. 그리고 재현 가능하고 테스트 가능해 — 타입 있는 입출력의 순수 함수가 절대 놀래면 안 되는 앱 부분 밑에 딱 원하는 거야. 판단 레이어는 확률적이어도 되지만, 네 파일을 쓰는 레이어는 안 되고, Rust 가 그 규율을 강제해.

#[tauri::command]
fn apply_ruleset(doc: String, ruleset: Ruleset) -> Result<String, String> {
    // 순수 변환: 같은 doc + 같은 ruleset -> 항상 같은 출력.
    // 모델 호출 없음, 무작위 없음 — 재현 가능하고 unit-testable.
    Ok(ruleset.apply(&doc))
}

파일 IO 는 Rust 커맨드

.md 파일을 읽고 쓰는 것 자체가 결정론적 작업이라, Tauri IPC 로 호출되는 Rust 커맨드야 — 프론트엔드가 직접 하는 게 아냐. 이건 봉합선 (결정론 = Rust) 을 존중하고, webview 파일 API 가 필요로 할 fs-scope 배관을 피해. 프론트엔드는 Rust 코어한테 로드나 저장을 요청하고, Rust 코어만 디스크를 건드려. 파일 IO 의 그 단일 소유자가 트랙 7 에서 다시 중요해져. 거기서 파일시스템이 진실의 원천으로 선언되거든.

Code

결정론적 변환을 Tauri 커맨드로·rust
// 결정론적 작업: 같은 입력이 항상 같은 출력.
// Rust 에 살고, Tauri IPC 로 프론트엔드에서 호출.
#[tauri::command]
fn apply_ruleset(doc: String, ruleset: Ruleset) -> Result<String, String> {
    // 모델 없음, 무작위 없음 — 순수하고 unit-testable 한 변환.
    Ok(ruleset.apply(&doc))
}

#[tauri::command]
fn read_note(path: String) -> Result<String, String> {
    std::fs::read_to_string(&path).map_err(|e| e.to_string())
}

#[tauri::command]
fn write_note(path: String, contents: String) -> Result<(), String> {
    std::fs::write(&path, contents).map_err(|e| e.to_string())
}

External links

Exercise

결정론적 변환 하나 (예: '선택을 shortcode 로 감싸기' 또는 'frontmatter 제거') 를 골라. 타입 시그니처를 써봐. 뭐가 들어가고 뭐가 나와. 그다음 그게 맞다고 증명할 한 줄 unit 테스트를 써. '이걸 더 따뜻하게' 같은 판단 작업엔 둘 다 깔끔히 못 한다는 걸 봐 — 바로 그게 그건 결정론적 코어에 안 속하는 이유야.
Hint
결정론적 함수는 (doc, args) -> output 같은 시그니처와 assert(fn(input) == expected) 같은 테스트를 가져. '톤에 따라 달라서' 단일 expected 출력을 못 쓰면, 그 작업은 결정론이 아니라 판단이야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.