Fat Gem에 작별을 고하며: 루비 개발 생태계 개선을 위한 제안

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

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

핵심 요약

  • 1 Fat Gem(사전 빌드된 라이브러리 포함 젬)은 설치 편의성을 제공하지만, 최신 Ruby 버전 지원 지연 및 보안 취약점 대응 문제를 야기합니다.
  • 2 Fat Gem 개발자들은 다양한 환경의 크로스 컴파일과 높은 유지보수 비용으로 큰 부담을 겪고 있습니다.
  • 3 빌드 환경 자동화 및 시스템 패키지 관리자 활용을 통해 이러한 문제를 해결하고 Ruby 생태계의 선순환을 이끌 수 있습니다.

도입

본 발표는 'Fat Gem에 작별을 고하며'라는 주제로, 루비(Ruby) 프로그래밍 언어의 젬(Gem) 생태계가 직면한 과제를 다룹니다. Fat Gem은 미리 빌드된 라이브러리를 포함하여 사용자의 설치 편의성을 높이는 장점이 있지만, 이로 인해 발생하는 여러 문제점을 개발자와 사용자 양측의 관점에서 조명하고, 이에 대한 해결책을 모색합니다. 발표자는 루비 커미터이자 기업 대표로서, 단순히 젬을 사용하는 것을 넘어 루비 생태계의 지속 가능한 발전을 위한 심도 있는 고찰을 제안합니다.

Fat Gem 사용은 사용자에게 즉각적인 편리함을 제공하나, 최신 루비 버전으로의 신속한 업데이트를 저해하는 주요 원인이 됩니다. 매년 크리스마스에 출시되는 새로운 루비 버전은 성능 향상과 신규 기능을 제공하지만, 사용 중인 Fat Gem 중 단 하나라도 최신 버전을 지원하지 않으면 전체 애플리케이션의 업데이트가 불가능해지는 상황이 발생합니다. Nokogiri와 같이 신속하게 대응하는 젬도 있지만, 모든 Fat Gem 개발자에게 이러한 노력을 기대하기는 어렵습니다. 또한, Fat Gem이 외부 라이브러리를 포함하는 경우, 해당 라이브러리의 보안 취약점이 발견되더라도 Fat Gem 개발자가 업데이트를 제공하기 전까지는 위험에 노출될 수 있습니다. 일반적으로 시스템 패키지 관리자가 보안 업데이트에 더 빠르게 대응하는 경향이 있어, Fat Gem에 의존하는 것은 이러한 이점을 상실하게 만듭니다.

개발자 관점에서 Fat Gem의 유지보수 비용은 상상 이상으로 높습니다. 특히 크로스 컴파일은 빌드 환경과 실행 환경이 다른 경우에 필수적인데, 이는 매우 복잡하고 오류 발생 가능성이 높습니다. 루비는 현재 최소 4개의 주요 버전이 유지보수되며, 각 버전에 대해 11개 이상의 다양한 환경(운영체제, 라이브러리 버전 등)을 지원해야 하므로, 하나의 Fat Gem을 릴리스할 때마다 44개 이상의 빌드된 젬을 생성해야 하는 부담이 있습니다. 또한, 여러 Fat Gem이 동일한 외부 라이브러리(예: zlib, curl)를 정적으로 링크할 경우, 심볼 충돌이 발생하여 예상치 못한 오류를 초래할 수 있습니다. 이는 Fat Gem 개발자들의 엄청난 노고를 요구하며, 새로운 기능 개발이나 버그 수정에 할애할 시간을 잠식합니다.

이러한 문제에 대한 해결책으로, 발표자는 빌드 환경 자동화 시스템을 제안합니다. 윈도우용 루비 인스톨러2(RubyInstaller2)가 MSYS2를 기반으로 빌드 환경을 자동으로 설정하고 젬 설치 시 필요한 의존 라이브러리를 시스템 패키지 관리자를 통해 설치하는 방식과 유사합니다. 발표자는 이를 구현하기 위해 rubygems-requirements-system이라는 젬을 개발하여, gemspec 파일에 필요한 시스템 라이브러리 정보를 명시하면 자동으로 설치되도록 했습니다. 이 방식은 Fat Gem의 필요성을 줄여 위에서 언급된 문제들을 해결할 수 있습니다. 물론, 빌드 시간이 길어지거나 시스템 환경이 변경되는 것에 대한 사용자 불만이 있을 수 있지만, 병렬 빌드, 컨테이너 환경 활용, 또는 앱별 패키지 관리자(Conda, Conan, VCPKG 등) 사용을 통해 해결할 수 있다고 제안합니다.

결론

궁극적으로 Fat Gem 의존성을 줄이고 빌드 환경을 자동화함으로써 젬 개발자들의 유지보수 부담을 경감시키면, 그들이 새로운 기능 개발과 버그 수정에 더 집중할 수 있게 되어 루비 생태계 전체의 선순환을 이끌 수 있습니다. 이는 사용자에게도 더 빠르고 안정적인 젬을 제공하는 결과로 이어질 것입니다. 그러나 루비젬스(RubyGems) 개발 팀이 파이썬의 '휠(wheel)'과 같은 사전 빌드된 바이너리 패키지 방식을 고려하고 있다는 점은 이 문제에 대한 다양한 관점과 복잡성을 시사합니다. 발표자는 루비 커뮤니티가 함께 논의하여 루비의 미래를 위한 최선의 방향을 모색해야 함을 강조하며 발표를 마무리합니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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