"웹 쪽에서 네이티브 힘은 함수 하나야: invoke. 나머지는 뭘 넘기고 뭘 await 하느냐일 뿐."
코어에 닿는 함수 하나
invoke(@tauri-apps/api/core에서)는 웹뷰가 등록된 command를 부르는 방식이야. command 이름이랑 인자 객체를 주면, command가 반환한 걸로 resolve되는 Promise를 돌려줘. Promise니까 await하고 try/catch로 감싸 — fetch랑 똑같이. 서버랑 대화할 때 이미 가진 멘탈 모델이 그대로 옮겨가.
camelCase ↔ snake_case 다리
누구나 한 번 놀라는 관례야: Rust 파라미터는 user_id(snake_case, 관용 Rust)인데, JavaScript에선 { userId }(camelCase, 관용 JS)를 넘겨. Tauri가 자동으로 매핑해. JS에서 snake_case로 보내면 인자가 조용히 안 묶여. camelCase로 보내면 그냥 돼. 각 언어가 제 스타일을 지키게 하고, 이음매는 Tauri가 처리해.
가능하면 반환을 타이핑해
TypeScript에선 invoke가 제네릭이야: invoke<Note>('get_note', { id })는 resolve 값이 Note라고 컴파일러한테 알려줘. 근데 이건 Rust command가 진짜 그 모양을 반환할 때만 정직해 — 두 쪽 사이엔 컴파일 타임 연결이 없으니, 네가 쓰는 타입은 네가 하는 약속이야. typed-ipc 레슨이 그 약속을 깨기 어렵게 만드는 법을 보여줘.