C.W.K.
Stream
Lesson 03 of 06 · published

멀티윈도우 앱

~13 min · tauri, windows, multi-window, architecture

Level 0웹 관광객
0 XP0/56 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete
"각 창은 자기만의 작은 브라우저 탭이야. JavaScript 한 줄도 안 나눠 가져 — 그러니 진실은 둘 다 닿을 수 있는 곳에 살아야 해: 코어."

별개 웹뷰, 별개 세계

모든 창은 자기 JavaScript 컨텍스트를 가진 독립 웹뷰야. 메인 창의 React state는 설정 창엔 존재 안 해 — 브라우저 탭 둘만큼 격리돼 있어. 이게 사람들을 놀래켜: 두 번째 창 연다고 네 store가 '공유'되지 않아. 두 창이 데이터에 동의해야 하면, 그 데이터는 Rust 코어(managed state)에 속하고, 각 창이 command로 읽어. 코어가 단일 진실 출처고, 창은 그 위의 뷰야.

창 사이 대화

창은 코어를 거쳐 조율해. 특정 창에 뭘 밀려면 emit_to("label", …), 모두에 방송하려면 emit. 흔한 흐름: 설정 창이 command로 설정을 저장하고(managed state 갱신), 코어가 settings-changed 이벤트를 emit하면 메인 창이 listen하고 반응해. 어떤 창도 다른 창을 직접 안 불러 — 다 코어를 거쳐서, 데이터 일관성을 지켜.

생애주기: show, hide, close

창엔 네가 통제하는 생애주기가 있어: show(), hide(), close(), 거기에 close-requested(닫기 전 확인) 같은 listen 가능한 이벤트나 포커스 변경. close 대신 hide는 창의 웹뷰를 살려둬(빠른 재오픈, state 유지). close는 파괴해(리소스 해제, 다음번 새 state). 재오픈이 즉시여야 하나 깨끗해야 하나로 골라.

Code

창은 직접이 아니라 코어를 거쳐 조율·rust
use tauri::{Manager, Emitter};

// 코어가 공유 진실; 창은 그걸 거쳐 동기화.
#[tauri::command]
fn set_theme(app: tauri::AppHandle, theme: String, state: tauri::State<Prefs>) {
    *state.theme.lock().unwrap() = theme.clone();   // 공유 state 갱신
    let _ = app.emit("settings-changed", theme);     // 모든 창에 알림
}

// 창 닫힘을 가로채 먼저 확인.
fn guard_close(win: &tauri::WebviewWindow) {
    let w = win.clone();
    win.on_window_event(move |event| {
        if let tauri::WindowEvent::CloseRequested { api, .. } = event {
            api.prevent_close();           // 기본 닫기 중단
            let _ = w.emit("confirm-close", ()); // UI에 확인 요청
        }
    });
}

External links

Exercise

두 번째 창을 열고 격리를 증명해: 메인 창에 React state를 좀 정하고, 두 번째 창을 열고, 그 state가 거기 없는 걸 확인해. 그다음 값을 managed Rust state에 저장하고 두 창이 command로 읽게 해서 동의시켜. 코어가 왜 진실 출처인지 방금 재발견한 거야.
Hint
두 번째 창은 새로 시작해 — 메인 창 store는 없어. 공유 값을 managed state의 Mutex로 옮기고, 두 창이 get command를 부르고(그리고 changed 이벤트를 listen해) 동기 유지해.

Progress

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

댓글 0

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

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