브라우저에서 Ruby DRb 실행: WebAssembly를 활용한 분산 객체 프로그래밍의 새로운 지평

[JA] dRuby on Browser Again! / @youchan @ledsun

작성자
RubyKaigi
발행일
2025년 05월 27일

핵심 요약

  • 1 이 발표는 Ruby WebAssembly(Wasm)를 활용하여 Ruby의 분산 객체 기술인 DRb를 웹 브라우저에서 구현하고 그 가능성을 탐구합니다.
  • 2 발표자들은 DRb를 브라우저 환경에서 실행하기 위한 각각의 접근 방식(drb-websockets, wasm-drb 및 wanz 라이브러리)과 그 기술적 과제를 소개합니다.
  • 3 Ruby Wasm 환경에서의 비동기 처리 문제와 JavaScript 세계와의 상호작용 방식이 주요 논점으로 다뤄지며, 브라우저 내 소켓 프로그래밍의 새로운 개념을 제시합니다.

도입

본 발표는 Ruby 프로그래밍 언어의 분산 객체 기술인 DRb(Distributed Ruby)를 웹 브라우저 환경에서 실행하는 혁신적인 시도에 대해 다룹니다. 특히, 최근 주목받는 Ruby WebAssembly(Wasm) 기술을 활용하여 브라우저에서 Ruby 코드를 직접 실행하고, 이를 통해 분산 시스템의 클라이언트-서버 통신을 간소화하는 방안을 모색합니다. 발표는 두 명의 연사, 요짱(Yo-chan)과 레드상(Red-san)이 각자의 독창적인 접근 방식과 구현 경험을 공유하며, 과거 RubyKaigi에서의 관련 발표들을 상기시키며 이 기술 발전의 연속성을 강조합니다. 이 발표는 단순히 기술적인 구현을 넘어, 웹 애플리케이션 개발 패러다임의 변화 가능성을 제시하고, 브라우저 환경에서의 루비 활용 범위를 확장하는 데 기여합니다.

요짱은 먼저 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 소켓 프로그래밍을 하듯이 브라우저 환경에서 웹소켓 통신을 다룰 수 있게 됩니다. wanzJS 젬을 활용하여 JavaScript 환경을 감지하고, JS::PromiseSchedulerRubyVM::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 세계 간의 전환이 복잡한 메커니즘을 요구한다는 점이 직관적이지 않다고 지적했습니다.

결론

본 발표는 Ruby Wasm과 DRb의 결합을 통해 웹 브라우저에서 분산 객체 프로그래밍의 가능성을 성공적으로 보여주었습니다. 요짱의 `drb-websockets`와 `wasm-drb` 젬, 그리고 레드상의 `wanz` 라이브러리는 각기 다른 방식으로 브라우저 환경에서 Ruby 기반의 분산 시스템을 구축하는 길을 열었습니다. 이러한 시도는 웹 애플리케이션 개발의 복잡성을 줄이고, Ruby 개발자들이 익숙한 Ruby 언어로 클라이언트-서버 간의 긴밀한 상호작용을 구현할 수 있는 새로운 기회를 제공합니다. 비록 현재 비동기 처리 및 Wasm-JS 상호작용과 같은 기술적 과제들이 남아있지만, "브라우저 내 소켓 프로그래밍"과 같은 새로운 개념의 등장은 Ruby가 웹 개발의 미래에서 중요한 역할을 할 수 있음을 시사합니다. 이 기술의 지속적인 발전은 웹 개발의 효율성을 높이고, 더욱 강력하고 유연한 웹 애플리케이션의 등장을 촉진할 것으로 기대됩니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!