본문 바로가기
C.W.K.
Stream
Lesson 01 of 06 · published

State<T>로 managed state

~13 min · tauri, state, rust, manage

Level 0웹 관광객
0 XP0/56 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete
"command는 기억이 없는 함수야. 여럿이 뭔가를 같이 기억해야 할 땐, 앱한테 기억을 쥐여줘: managed state."

한 번 등록하면 어디서든 받아

command 혼자선 호출과 호출 사이에 아무것도 못 기억해. 데이터를 같이 쓰려면 — 설정이든, DB 풀이든, 카운터든, 캐시든 — Builder에서 .manage(value)로 맡겨. 그다음부턴 어떤 command든 tauri::State<T> 타입 파라미터를 선언해서 달라고 하면 돼. Tauri가 그 파라미터를 보고 맡아둔 인스턴스를 알아서 넣어줘. 프론트엔드는 여기 낄 일이 없어. 전부 코어 안에 살거든.

타입 하나에 값 하나

managed state는 타입으로 찾아. AppConfig 하나, Database 하나, Counter 하나를 맡겨두면 — State<AppConfig>를 달라고 할 때마다 늘 같은 인스턴스가 와. 바탕 타입이 같은 걸 둘 두고 싶으면 각각 newtype으로 감싸(struct ReadPool(Pool)이랑 struct WritePool(Pool)처럼) 타입 시스템이 구분하게 해. 이건 제약이 아니라 기능이야 — '어느 state?'가 모호해질 틈을 안 주거든.

받는 건 공유 참조야

네가 받는 건 맡겨둔 값으로 가는, 같이 쓰는 읽기 전용 손잡이야. 읽기만 하는 것(한 번 불러온 설정 같은)엔 완벽하지. 근데 그걸로 필드를 직접 바꿀 순 없다는 뜻이기도 해. borrow checker가 공유 상태에서의 변경을 안 허락하거든. state가 바뀌어야 하면 interior mutability(Mutex)를 꺼내는데, 그게 바로 다음 레슨이야. 지금은 읽기 위주 state를 맡기고 필요한 command에 받아 쓰는 것부터.

Code

한 번 맡기고, command에서 받아 쓰기·rust
use tauri::Manager;

struct AppConfig {
    api_base: String,
    theme: String,
}

// command가 State<T> 파라미터를 선언해서 managed state를 받아.
#[tauri::command]
fn get_api_base(config: tauri::State<AppConfig>) -> String {
    config.api_base.clone()
}

pub fn run() {
    tauri::Builder::default()
        // 값을 한 번 등록; Tauri가 앱 생애 동안 소유.
        .manage(AppConfig {
            api_base: "https://api.example.com".into(),
            theme: "dark".into(),
        })
        .invoke_handler(tauri::generate_handler![get_api_base])
        .run(tauri::generate_context!())
        .expect("error while running app");
}

External links

Exercise

앱에 managed state를 더해봐. 읽기 전용 문자열 하나(앱 버전이나 API base 같은)를 든 struct면 돼. .manage()로 맡기고, tauri::State<T>로 그걸 읽어 프론트엔드에 돌려주는 command를 짜. 값이 왕복하는지 확인해. 코어에 첫 공유 기억을 준 거야.
Hint
두 군데야. Builder에 .manage(MyConfig { ... }), 그리고 command 파라미터에 config: tauri::State<MyConfig>. 'state not managed'가 뜨면 command는 짰는데 .manage() 줄을 빠뜨린 거야.

Progress

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

댓글 0

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

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