Compo: Ruby 프로젝트를 원바이너리로 만드는 도구 업데이트 및 구현 내용

[JA] The Ruby One-Binary Tool, Enhanced with Kompo / ahogappa @ahogappa

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

핵심 요약

  • 1 Compo는 Ruby 프로젝트를 단일 실행 파일(원바이너리)로 만들어 배포 및 실행의 용이성을 극대화하는 도구입니다.
  • 2 이전 버전의 Compo는 `require` 오버라이딩 방식의 한계로 Rails와 같은 복잡한 프로젝트를 원바이너리화하기 어려웠습니다.
  • 3 업데이트된 Compo는 가상 파일 시스템과 `dlsym`을 활용한 C 함수 후킹을 통해 이 문제들을 해결하여, Rails 애플리케이션의 성공적인 원바이너리화를 시연했습니다.

도입

본 발표는 Ruby 프로젝트를 단일 실행 파일(One-binary)로 만드는 도구인 'Compo'의 업데이트된 내용과 그 구현 방식에 대해 다룹니다. Compo는 Ruby 애플리케이션 배포 시 발생하는 버전 불일치, 복잡한 환경 설정, 추가 프로그램 설치 등의 문제를 해결하고, 개발자가 의도한 대로 프로그램을 실행할 수 있도록 돕는 것을 목표로 합니다. 특히, Ruby 기반 게임 엔진 개발 경험에서 비롯된 필요성으로 시작되었으며, '어디서든 쉽고 빠르게 실행되는 원바이너리'를 핵심 가치로 삼고 있습니다.

이전 Compo 버전은 Ruby의 require 메서드를 오버라이드하여 필요한 스크립트와 확장 라이브러리를 단일 실행 파일에 통합하는 방식을 사용했습니다. 이 방식은 Sinatra와 SQLite를 결합한 정도의 소규모 애플리케이션에는 적용 가능했으나, Rails와 같이 규모가 크고 복잡한 Ruby 프로젝트에는 여러 한계점을 드러냈습니다. 주요 문제점으로는 autoload 기능과의 충돌로 인한 초기화 문제, require 외의 다른 I/O 메서드(File.read, IO.open 등)로는 임베드된 파일을 읽을 수 없는 점, 그리고 디렉토리 개념의 부재 등이 있었습니다. 이는 Ruby 프로젝트가 설정 파일, 이미지, CSV 등 다양한 비-Ruby 파일을 포함하며 디렉토리 구조에 의존하는 경우가 많기 때문에 큰 걸림돌이었습니다.

새로운 Compo는 이러한 문제들을 해결하기 위해 두 가지 핵심 전략을 도입했습니다. 첫째, 바이너리 내부에 가상 파일 시스템(Virtual File System, VFS)을 구축하여 임베드된 파일과 디렉토리를 계층 구조로 관리합니다. 이 VFS는 읽기 전용으로 구현되어 단순한 파일 로딩에 중점을 둡니다. 둘째, Ruby의 C 레벨 I/O 함수(read, open, chdir 등) 호출을 가로채는 방식(인터셉션)을 사용합니다. 이를 위해 dlsym 함수와 RTLD_NEXT 핸들을 이용하여 원본 C 함수의 주소를 동적으로 획득하고, Compo의 래핑 함수를 통해 실제 파일 시스템과 가상 파일 시스템 중 어디에서 파일을 읽어올지 동적으로 전환합니다. 이 방식은 require뿐만 아니라 모든 파일 I/O 작업에서 임베드된 데이터를 투명하게 처리할 수 있게 합니다. 시연에서는 Ruby가 설치되지 않은 Docker 환경에서 Rails 애플리케이션이 성공적으로 단일 실행 파일로 구동되는 것을 보여주며, 이는 Compo의 발전된 기능을 명확하게 입증했습니다.

결론

업데이트된 Compo는 기존의 기술적 한계를 극복하고 Rails와 같은 대규모 Ruby 프로젝트를 원바이너리로 만드는 데 성공했습니다. 이는 Ruby 애플리케이션의 배포 및 실행 방식을 혁신할 잠재력을 보여줍니다. 현재 Compo는 '쉽게 원바이너리화', '어디서든 빠르게 실행', '추가 설치 불필요'라는 목표에 크게 근접했으며, 앞으로 Gem 패키징을 통한 사용성 개선과 크로스 플랫폼 지원 확대를 통해 더욱 완성도 높은 도구로 발전해 나갈 계획입니다. Compo는 Ruby 개발자들에게 새로운 배포 선택지를 제공하며, Ruby 프로젝트의 접근성과 활용도를 높이는 데 기여할 것으로 기대됩니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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