Fat Gem과의 이별: 루비 개발의 더 나은 미래를 위한 제안

[JA] Goodbye fat gem 2025 / Sutou Kouhei @ktou

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

핵심 요약

  • 1 Fat Gem이 최신 루비 호환성, 취약성 관리, 높은 유지보수 비용 등 다양한 문제를 야기함을 지적하고, 이를 해결하기 위한 자동 빌드 환경 도입을 제안합니다.
  • 2 RubyGems의 `requirements` 필드를 활용하여 시스템 의존 라이브러리를 자동 설치하는 `rubygems-requirements-system` 젬을 소개하며 Fat Gem 없는 개발 환경을 구현하는 방안을 제시합니다.
  • 3 Fat Gem 제거 시 발생할 수 있는 설치 시간 증가 및 시스템 변경 문제에 대한 해결책을 논의하고, 루비 커뮤니티 내 Fat Gem 도입(휠) 논의라는 상반된 흐름을 공유하며 미래 방향을 모색합니다.

도입

본 발표는 5년 전 진행된 강연의 업데이트 버전으로, 루비 개발자뿐만 아니라 사용자들에게도 중요한 'Fat Gem'에 대한 문제를 제기하고 해결 방안을 모색합니다. Fat Gem은 미리 빌드된 라이브러리를 포함하는 젬으로, 일반적인 젬 설치 시 필요한 빌드 환경 구축의 어려움과 실패 가능성을 줄여주어 사용자들에게는 편리함을 제공합니다. 그러나 발표자는 이러한 편리함 뒤에 숨겨진 문제점과 개발자들의 고충을 공유하며, Fat Gem에 의존하는 현 개발 방식에 의문을 던집니다.

Fat Gem이 야기하는 문제점

발표자는 Fat Gem이 사용자 및 개발자 관점에서 세 가지 주요 문제를 발생시킨다고 설명합니다.

1. 최신 루비 버전 즉시 사용 불가 (사용자 관점)

  • 루비는 매년 크리스마스에 새 버전이 출시되며, 사용자들은 성능 향상 및 신기능을 위해 빠르게 업데이트하기를 원합니다.
  • 하지만 사용하는 Fat Gem 중 단 하나라도 최신 루비 버전을 지원하지 않으면 전체 애플리케이션 업데이트가 지연됩니다.
  • 예시: nokogiri 젬은 루비 3.4.0 출시 당일 빠르게 대응했으나, 모든 Fat Gem 개발자가 이러한 신속한 대응을 할 수는 없습니다.
  • 이는 결국 Fat Gem 개발자의 부담을 가중시키고, 확장 라이브러리 개발 및 유지보수 의지를 저해하여 장기적으로 루비 생태계에 악영향을 미칠 수 있습니다.

2. 취약성 관리의 어려움 (사용자 관점)

  • 바인딩 Fat Gem은 종속 라이브러리까지 젬 내부에 포함하기 때문에, 해당 라이브러리에 취약성이 발견되어도 Fat Gem 개발자가 업데이트를 해주기 전까지는 사용자가 직접 대응하기 어렵습니다.
  • 이는 보안 업데이트의 불확실성을 높이며, 시스템 패키지 매니저를 통한 업데이트보다 지연될 수 있습니다.
  • 예시: nokogiri가 사용하는 libXLT의 취약성 수정 후 nokogiri는 2일 만에 업데이트되었으나, 일반적인 패키지 매니저가 더 빠를 수 있습니다. 그러나 이 경우 nokogiri가 더 빨랐던 예외적인 상황이었습니다.

3. 높은 유지보수 비용 (개발자 관점)

  • Fat Gem, 특히 바인딩 젬은 크로스 컴파일이 필요한 경우가 많아 유지보수 비용이 매우 높습니다.
  • 크로스 컴파일은 빌드 환경과 실행 환경이 달라 어려우며, rake-compiler-dock와 같은 도구가 환경 구축을 돕지만, 컴파일 자체의 난이도는 여전히 높습니다.
  • 루비 버전(4개)과 환경(11개, libc 버전 등)을 조합하면 단일 젬을 위해 44가지 빌드 버전을 만들어야 하는 부담이 있습니다.
  • 정적 링크(static link) 또한 복잡하며, 여러 Fat Gem이 동일한 라이브러리(예: zlib, curl)의 다른 버전을 포함할 경우 심볼 충돌 등의 문제가 발생할 수 있습니다.

해결책 제안: 자동 빌드 환경 구축

발표자는 빌드 환경을 자동으로 구축해주는 메커니즘을 제안합니다. * RubyInstaller2 (Windows): 이미 MSYS2 기반의 자동 빌드 환경 및 패키지 관리 기능을 제공하며, gemspecrequirements 메타데이터를 통해 종속 라이브러리를 자동으로 설치합니다. 이를 통해 컴파일러나 라이브러리 누락으로 인한 설치 실패를 크게 줄입니다. * rubygems-requirements-system: 발표자가 2025년에 개발한 이 젬은 RubyGems 및 Bundler 플러그인으로 작동하며, gemspecrequirements 필드에 시스템 의존성을 명시하면 해당 시스템의 패키지 매니저를 통해 자동으로 설치합니다. 이는 다양한 플랫폼에서 Fat Gem 없이도 설치 실패 문제를 해결할 수 있게 합니다.

Fat Gem 제거 시 발생 가능한 문제 및 해결 방안

  • 설치 시간 증가: 빌드 과정으로 인해 설치 시간이 길어질 수 있으나, 병렬 빌드 등 리소스 증가를 통해 완화할 수 있습니다.
  • 시스템 변경에 대한 거부감: gem install 시 시스템이 변경되는 것을 꺼리는 사용자들을 위해, 컨테이너 환경 사용, 애플리케이션별 패키지 매니저(Conda, Conan, VCPKG 등) 활용, 또는 Homebrew와의 통합 등을 대안으로 제시합니다.

결론

발표자는 Fat Gem을 제거함으로써 개발자의 유지보수 비용을 절감하고, 이는 새로운 기능 개발 및 버그 수정에 더 많은 시간을 할애하여 궁극적으로 사용자에게 더 나은 루비 생태계를 제공할 것이라고 강조합니다. `rubygems-requirements-system` 젬은 이러한 목표를 달성하기 위한 구체적인 방법론을 제시합니다. 그러나 발표 막바지에 루비젬스 개발팀이 파이썬의 '휠(wheel)'과 유사한 Fat Gem 방식을 고려하고 있다는 상반된 소식을 전하며, 루비 커뮤니티가 어떤 미래를 선택할지에 대한 질문을 던집니다. 이는 Fat Gem의 장단점을 심층적으로 이해하고, 모두가 만족할 수 있는 최적의 방향을 함께 논의해야 함을 시사합니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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