Fat Gem에 작별을 고하다: 더 나은 루비 생태계를 위한 제안

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

3줄 요약

  • 본 발표는 Ruby의 Fat Gem(사전 빌드된 라이브러리를 포함하는 Gem)이 사용자 및 개발자에게 야기하는 문제점을 지적합니다.
  • 발표자는 최신 Ruby 버전 사용 지연, 보안 취약점, 높은 유지보수 비용 등의 문제 해결을 위해 빌드 환경 자동화 시스템 도입을 제안합니다.
  • 궁극적으로 Fat Gem 사용을 중단하고 시스템 패키지 매니저를 통한 의존성 관리를 통해 루비 생태계의 선순환을 목표로 합니다.

본 발표는 'Good-bye Fat Gem'이라는 주제로, Ruby 개발 및 사용 환경에서 'Fat Gem'이 초래하는 다양한 문제점과 이에 대한 해결 방안을 모색합니다. Fat Gem은 사전에 빌드된 라이브러리를 포함하는 Gem으로, 사용자가 빌드 환경을 따로 구축할 필요 없이 손쉽게 설치할 수 있다는 장점 때문에 널리 사용되어 왔습니다. 그러나 발표자는 이러한 Fat Gem이 장기적으로 Ruby 생태계에 부정적인 영향을 미칠 수 있음을 강조하며, 새로운 접근 방식의 필요성을 역설합니다.

Fat Gem의 문제점은 크게 사용자 측면과 개발자 측면으로 나눌 수 있습니다. 사용자 측면에서는 첫째, 최신 Ruby 버전 사용의 지연을 야기합니다. Ruby는 매년 크리스마스에 새 버전이 출시되지만, 모든 Fat Gem이 최신 Ruby 버전에 맞춰 즉시 업데이트되지 않으면, 사용자는 최신 Ruby 버전을 사용할 수 없게 됩니다. 이는 Ruby의 새로운 기능이나 성능 개선을 적시에 활용하지 못하게 하는 요인이 됩니다. 둘째, 보안 취약점 대응에 어려움을 겪습니다. Fat Gem은 의존하는 외부 라이브러리를 내부에 포함하는 경우가 많아, 해당 라이브러리에 취약점이 발견되더라도 Fat Gem 개발자가 직접 업데이트 버전을 출시해야만 사용자가 안전하게 사용할 수 있습니다. 이는 패키지 매니저를 통한 시스템 라이브러리 업데이트보다 느리고 비효율적일 수 있습니다.

개발자 측면에서 Fat Gem은 매우 높은 유지보수 비용을 발생시킵니다. 특히 바인딩 Gem의 경우, 크로스 컴파일(빌드 환경과 실행 환경이 다른 경우의 컴파일)이 필수적이며, 이는 매우 복잡하고 오류 발생 가능성이 높습니다. rake-compiler-dock와 같은 도구가 크로스 컴파일 환경 구축을 돕지만, 여전히 다양한 플랫폼(예: 11가지 환경)과 여러 Ruby 버전(예: 4개 버전)의 조합을 지원하기 위해 수십 개의 빌드된 Gem을 관리해야 합니다. 또한, zlib, curl과 같은 유명 라이브러리를 정적 링크(static link)하는 과정에서 심볼 충돌이 발생할 수 있어 추가적인 어려움이 따릅니다.

발표자는 이러한 문제 해결을 위한 대안으로 ‘빌드 환경 자동화’를 제안합니다. RubyInstaller2와 같이 시스템 패키지 매니저와 연동하여 필요한 의존 라이브러리를 자동으로 설치하는 방식이 그 예시입니다. 이를 위해 rubygems-requirements라는 Gem을 개발하여 Gemfile에 의존 라이브러리를 명시하면 자동으로 시스템 패키지 매니저를 통해 설치되도록 구현했습니다. 이 방식은 Fat Gem 없이도 설치 실패 문제를 해결하고, Fat Gem이 야기하는 문제점들을 해소할 수 있다고 주장합니다.

물론 이 제안에도 몇 가지 문제가 제기될 수 있습니다. 첫째, 빌드 과정이 추가되어 설치 시간이 길어질 수 있습니다. 이에 대해서는 병렬 빌드나 더 강력한 컴퓨팅 리소스 활용을 통해 완화할 수 있다고 언급합니다. 둘째, Gem 설치 시 시스템이 변경되는 것을 꺼리는 사용자들의 우려입니다. 이에 대해서는 컨테이너 환경 활용, conda, conan, vcpkg와 같은 애플리케이션별 패키지 매니저 사용, 또는 Homebrew와의 통합을 통해 해결할 수 있음을 제시합니다. 발표자는 시스템 패키지 매니저를 활용함으로써 보안 취약점 대응 등 유지보수의 이점을 강조합니다.

결론적으로, 발표자는 Fat Gem의 사용을 중단하고 빌드 환경 자동화 및 시스템 패키지 매니저를 통한 의존성 관리를 통해 Ruby 생태계의 지속 가능하고 건강한 발전을 도모할 수 있다고 역설합니다. 이는 Gem 개발자들이 유지보수 부담을 줄이고 새로운 기능 개발에 집중할 수 있게 하며, 사용자들은 최신 Ruby 버전을 더 빨리 사용하고 보안 위험으로부터 안전해질 수 있도록 하여 선순환 구조를 만들 수 있다는 비전입니다. 하지만 RubyGems 개발 팀에서는 Python의 'wheel'과 유사한 Fat Gem 방식을 고려하고 있어, 발표자의 제안과 다른 방향으로 나아갈 가능성도 있음을 언급하며, 커뮤니티 차원의 지속적인 논의와 협력을 통해 Ruby의 더 나은 미래를 함께 만들어갈 것을 제안하며 발표를 마무리합니다.