요짱은 먼저 Ruby Wasm과 DRb의 기본 개념을 설명합니다. Ruby Wasm은 CRuby를 WebAssembly로 컴파일하여 브라우저에서 루비 코드를 실행할 수 있게 하는 기술이며, DRb는 서로 다른 Ruby VM 간에 객체를 분산하여 원격으로 메서드를 호출할 수 있게 하는 기술입니다. 이 두 기술을 결합함으로써 얻는 가장 큰 이점은 웹 애플리케이션에서 일반적으로 필요한 JSON API 구현의 복잡성을 크게 줄일 수 있다는 점입니다. 서버는 단순히 클래스를 정의하고, 클라이언트는 해당 객체의 메서드를 호출하는 방식으로 통신이 이루어져 개발 생산성을 높일 수 있습니다. 또한, 여러 브라우저 클라이언트가 서버의 동일한 객체를 공유하여 실시간으로 상호작용하는 분산 애플리케이션 구현이 용이해집니다. 요짱은 이를 시연하기 위해 두 개의 브라우저에서 공유 카운터를 증가시키는 데모와 실시간 메시지 공유 데모를 선보였습니다. 그녀의 구현은 drb-websockets
(서버 측)와 wasm-drb
(Wasm 측) 두 가지 젬을 기반으로 합니다. drb-websockets
는 DRb 프로토콜을 웹소켓 위에서 동작하게 하며, wasm-drb
는 Wasm 환경에서 소켓 통신을 직접 구현하여 DRb를 가능하게 합니다. 특히 클라이언트에서 서버로 콜백을 전달하는 경우 서버 측 DRb 구현이 필요하다는 점을 강조했습니다.
이어서 레드상은 요짱과 동일한 목표를 가졌지만, 다른 접근 방식을 소개합니다. 그는 wanz
라는 라이브러리를 개발하여 C Ruby와 브라우저 환경 모두에서 동일하게 동작하는 소켓 통신 추상화 계층을 제공합니다. wanz
의 핵심은 Ruby의 동기적인 TCPSocket
인터페이스와 JavaScript의 비동기적인 WebSocket
이벤트 핸들러 간의 차이를 메우는 데 있습니다. 이를 통해 개발자는 마치 일반적인 TCP 소켓 프로그래밍을 하듯이 브라우저 환경에서 웹소켓 통신을 다룰 수 있게 됩니다. wanz
는 JS
젬을 활용하여 JavaScript 환경을 감지하고, JS::PromiseScheduler
와 RubyVM::Fiber.yield
를 사용하여 비동기 JavaScript 연산을 Ruby 코드에는 동기적으로 보이게 만듭니다. 또한, wanz
는 Node.js와 node-wasm
을 활용하여 JavaScript 기능에 대한 단위 테스트를 실행하는 독특한 테스트 전략을 사용합니다. 레드상은 wanz
가 단순한 웹소켓 통신 추상화를 넘어 “브라우저 내 소켓 프로그래밍(Socket Programming in Browser)”이라는 새로운 개념을 제시한다고 주장합니다.
두 발표자는 공통적으로 Ruby Wasm 환경에서의 비동기 처리와 JavaScript 세계와의 상호작용에서 발생하는 기술적 과제들을 언급했습니다. 특히, DRb 호출이 비동기적으로 이루어지면서 Ruby Wasm에서는 Promise를 반환하고 await
를 사용해야 하는 점, 그리고 Wasm과 JS 세계 간의 전환이 복잡한 메커니즘을 요구한다는 점이 직관적이지 않다고 지적했습니다.