Ruby2JS와 트랜스파일 스펙트럼
Ruby2JS는 Ruby 코드를 순수한 JavaScript로 변환하는 도구입니다. 이는 CRuby나 JRuby와 달리 런타임 메타프로그래밍(예: method_missing) 기능을 포기하는 대신, Ruby 배열이 JS 배열로, Ruby 클래스가 JS 클래스로 변환되는 등 JavaScript 생태계와의 완벽한 통합을 제공합니다. 이를 통해 임피던스 불일치 없이 JavaScript 라이브러리를 원활하게 사용할 수 있습니다.
Juntos 소개
Juntos는 Ruby2JS 필터 세트와 소규모 런타임으로 구성되어 JavaScript 플랫폼을 위한 Rails 호환 프레임워크를 구현합니다. Rails는 has_many :comments와 같은 DSL을 통해 런타임에 메서드를 생성하는 메타프로그래밍에 크게 의존합니다. Juntos는 이 방식을 역전시켜, Rails가 런타임에 생성할 로직을 트랜스파일 시점에 필터가 미리 계산하고 확장합니다. 결과적으로, 어떤 JavaScript 환경에서든 실행 가능한 관용적인 JavaScript 코드가 생성됩니다.
예시:
ruby
class Article < ApplicationRecord
has_many :comments, dependent: :destroy
validates :title, presence: true
end
위 Ruby 코드는 다음과 같은 JavaScript 코드로 변환됩니다.
javascript
class Article extends ApplicationRecord {
static associations = { comments: { type: "hasMany", dependent: "destroy" } };
static validations = { title: { presence: true } };
}
이는 동일한 모델, 컨트롤러, ERB 템플릿을 다른 프로그래밍 언어로 실행할 수 있음을 의미합니다.
데모 시연
Juntos는 고전적인 Rails 블로그 애플리케이션을 통해 그 기능을 시연합니다. 이 블로그는 중첩된 댓글, 유효성 검사, Tailwind CSS를 포함하며, 다음 환경에서 실행될 수 있습니다.
-
Rails: 기존 Rails 서버에서 실행
-
브라우저: IndexedDB를 사용하여 브라우저 내에서 실행
-
Node.js: SQLite를 사용하여 Node.js 환경에서 실행
-
Vercel Edge: Neon 데이터베이스와 함께 Vercel Edge에 배포
-
Cloudflare Workers: D1 데이터베이스와 함께 Cloudflare Workers에 배포
이러한 데모는 동일한 코드베이스가 다섯 가지 다른 런타임에서 실행될 수 있음을 보여줍니다. config/database.yml을 환경별로 구성하여 손쉽게 배포 대상을 변경할 수 있습니다.
다양한 플랫폼, 다양한 기능
Juntos는 현재 6개의 JavaScript 플랫폼을 대상으로 하며, 동일한 코드가 모든 플랫폼에서 실행되지만 각 플랫폼은 고유한 강점과 제약 조건을 가집니다.
-
브라우저: 완벽한 소스맵, 오프라인 기능, 서버 불필요 (SMTP, 서버 측 API 제한)
-
Node/Bun/Deno: 전체 기능 및 생태계 활용 가능 (Puppeteer, LangChain, TensorFlow) (호스팅 필요)
-
Vercel/Cloudflare: 글로벌 엣지, 자동 스케일링, 요청당 지불 (파일 시스템, 작업, 웹소켓 제한)