Juntos: Ruby2JS를 통한 Rails 애플리케이션의 서버리스 및 다중 플랫폼 배포

Rails to the Edge and Beyond

작성자
HackerNews
발행일
2026년 01월 02일

핵심 요약

  • 1 Juntos는 Ruby2JS를 활용하여 Rails 애플리케이션 코드를 JavaScript로 변환, 서버리스 및 다양한 JavaScript 기반 플랫폼에서 실행할 수 있게 합니다.
  • 2 Rails의 메타프로그래밍 기능을 트랜스파일 시점에 정적으로 처리하여, 런타임 오버헤드 없이 관용적인 JavaScript 코드를 생성합니다.
  • 3 동일한 코드베이스로 브라우저, Node.js, Vercel, Cloudflare 등 여러 환경에 배포 가능하며, 벤더 종속성 없이 Rails의 생산성을 유지합니다.

도입

Rails는 아이디어를 작동하는 애플리케이션으로 빠르게 전환하는 데 탁월한 생산성을 제공하지만, 배포의 미래로 여겨지는 서버리스 환경은 주로 JavaScript 기반이라는 한계가 있었습니다. 이로 인해 개발자들은 Rails의 생산성과 서버리스의 이점 중 하나를 선택해야 하는 딜레마에 직면했습니다. Juntos는 이러한 간극을 해소하기 위해 등장한 솔루션으로, Ruby2JS를 통해 Rails 애플리케이션을 다양한 JavaScript 플랫폼에서 실행할 수 있도록 지원합니다.

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: 글로벌 엣지, 자동 스케일링, 요청당 지불 (파일 시스템, 작업, 웹소켓 제한)

결론

Juntos는 벤더 종속성 없는 개발 환경을 제공합니다. 생성된 `dist/` 디렉터리는 완전한 JavaScript 애플리케이션이므로, 필요시 순수 JS로 개발을 이어갈 수 있으며, Ruby 코드를 변경하지 않고도 브라우저, Node, Vercel 등 다양한 환경으로 전환이 가능합니다. 이는 Rails 개발자에게 익숙한 패턴을 유지하면서도, 브라우저의 IndexedDB, Node.js의 SQLite, 엣지 함수의 서버리스 데이터베이스 등 다양한 환경에서 동일한 코드를 실행할 수 있는 유일무이한 접근 방식입니다. 아직 초기 단계이지만 핵심 기능은 이미 배포 가능한 수준으로 작동하며, 향후 Action Mailer, Active Storage 필터, Vite 플러그인 등으로 확장될 잠재력을 가지고 있습니다. Juntos는 Ruby와 JavaScript, Rails와 서버리스 플랫폼, 개발자의 생산성과 현대적인 배포 방식이 '함께' 나아가는 길을 제시합니다.

댓글 0

댓글 작성

댓글 삭제 시 비밀번호가 필요합니다.

이미 계정이 있으신가요? 로그인 후 댓글을 작성하세요.

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

아직 댓글이 없습니다

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