RubyGems 버리기
원문은 Mitchell Hashimoto님이 에 게재했습니다. 이 블로그 구독하기
Vagrant 1.1+부터는 더 이상 RubyGems를 설치 방법으로 지원하지 않습니다. 대신 미리 만들어진 패키지 또는 인스톨러를 사용해 Vagrant 1.1+를 설치해야 합니다. gem 기반 설치에 익숙한 사람들에게는 혼란과 반감을 불러일으켰습니다. 이 글에서는 RubyGems를 버리게 된 이유와 장기적으로 Vagrant 커뮤니티에 왜 더 나은 선택인지 하나씩 짚어보려 합니다.
3년여 전 처음 Vagrant를 RubyGem으로 출시했습니다. Vagrant는 Ruby로 작성되었고, 당시 이미 RubyGems를 만드는 데 익숙했기 때문에 당연한 배포 방식이라고 생각했습니다.
이 결정을 단 한순간도 후회하지 않습니다. Ruby 커뮤니티는 최첨단 기술에 매우 개방적이며, RubyGem 형태로 배포한 덕분에 프로젝트가 초기에 더 널리 알려질 수 있었다고 생각합니다.
하지만 그 이후로 많은 것을 배우고 깨달으며, 여러 가지 이유로 RubyGems가 더 이상 최선의 선택이 아니라는 결론에 이르렀습니다.
이 글에서는 인스톨러가 왜 Vagrant 사용자의 삶을 더 낫게 만드는지 설명하려 합니다. 다음 글에서는 인스톨러가 플러그인 개발자와 그 생태계에 어떤 영향을 미치는지 설명할 예정입니다.
Ruby를 쓰지 않는 사람들
2010년 처음 출시된 이후 Vagrant는 수백 개 기업과 수천 명의 사람들이 사용하는 도구로 성장했습니다. 정확한 수치를 댈 수는 없지만, 제가 만난 Vagrant 사용자 중 대다수는 Ruby 개발자가 아닙니다.
인스톨러를 만들기 전까지 Vagrant에 대해 가장 많이 들었던 불만은 RubyGems에 관한 것이었습니다. 저 스스로 Ruby를 다루는 사람으로서 RubyGems는 늘 간단하다고 생각했습니다. 하지만 Ruby 커뮤니티 밖에 있는 사람들에게는 RubyGems를 익히고 Ruby를 설치하는 등의 과정 자체가 진입 장벽이 높아, 많은 사람들이 Vagrant 설치조차 시도하지 않았다는 사실을 알게 됐습니다.
반면 Vagrant의 모든 의존성(Ruby 포함)을 하나로 묶은 패키지는 Vagrant 설치를 극도로 간단하게 만듭니다.
버그
Vagrant는 Ruby, RubyGems, OpenSSL, zlib, JSON 등 수많은 외부 의존성을 가지고 있습니다. RubyGems 방식에서는 사용자가 이러한 의존성을 소스에서 직접 빌드하거나 각자 선호하는 패키지 매니저를 통해 수동으로 설치해야 했습니다.
이처럼 환경이 제각각이다 보니 가능한 모든 환경에서 Vagrant를 테스트할 수 없었습니다. 제 시스템과 제가 설치한 버전의 의존성에서는 Vagrant가 잘 동작한다는 건 알았지만, 다른 모든 시스템에서도 동작할지는 알 수 없었습니다.
그래서 Vagrant가 너무 오래된 의존성, 버그가 있는 의존성, 혹은 권한 오류 등으로 단순히 깨진 의존성과 함께 사용되어 버그 제보가 들어오는 일이 흔했습니다.
그게 제 잘못으로 받아들여지든 사용자의 잘못으로 받아들여지든 신경 쓰지 않습니다. 적절한 버전을 설치하지 않았다고 사용자를 탓하지 않습니다. 특히 패키지 저장소에 있는 것을 그대로 설치한 경우라면 더욱 그렇습니다.
하지만 깨진 환경 때문에 Vagrant가 충돌하고, 10번 중 9번은 잘못 구성된 환경 때문인데도 사람들이 이를 Vagrant 자체의 불안정성으로 받아들이는 것은 매우 큰 문제입니다.
인스톨러를 사용하면 Vagrant에 필요한 모든 의존성을 함께 제공할 수 있고, 사용자에게 Vagrant가 해당 의존성들과 함께 정상적으로 동작할 것임을 보장할 수 있습니다. 이는 특히 Windows 환경에서 큰 도움이 됩니다.
유연성
환경을 엄격하게 통제하기 때문에 Vagrant가 의존하는 요소들을 개선하고 세밀하게 조정할 수 있습니다.
Vagrant 1.1에서는 기존에 사용하던 느리고 순수 Ruby로 된 tar 라이브러리를 C로 작성된 고성능의 안정적이고 유연한 애플리케이션이자 라이브러리인 libarchive로 교체했습니다. 이제 libarchive는 모든 Vagrant 인스톨러에 포함되어 제공되므로 사용자는 별도의 의존성을 설치할 필요가 없고, Vagrant가 이를 사용하고 있는지 신경 쓸 필요도 없습니다.
Vagrant 1.2에서는 다운로더를 순수 Ruby HTTP에서 cURL을 사용하도록 교체했습니다. 이는 훨씬 빠르고 FTP를 비롯한 훨씬 더 많은 네트워크 프로토콜을 지원합니다. 모든 인스톨러에는 cURL이 미리 설치된 상태로 포함됩니다. 이번에도 사용자는 신경 쓸 필요가 없습니다.
앞으로는 순수 Ruby SSH 라이브러리를 C로 작성된 더 안정적이고 잘 유지보수되는 SSH 라이브러리로 교체할 예정입니다. 이번에도 사용자는 신경 쓸 필요가 없지만, SSH가 훨씬 더 안정적이 되었다는 것은 체감하게 될 것입니다.
이러한 변경들을 통해 사용자가 눈치채지 못하게 중요한 의존성들을 교체할 수 있습니다. 사실 사용자가 느끼는 것은 Vagrant 경험이 훨씬 더 좋아졌다는 것뿐입니다. 속도는 더 빨라지고, 충돌은 사라지며, Vagrant는 더 많은 기능을 지원하게 됩니다.
전반적으로, RubyGems로 배포할 때는 안전하게 할 수 없었던 변경들을 할 수 있게 되면서 Vagrant는 훨씬 더 좋아졌습니다.
글을 무작위로 읽기
댓글
로그인하고 댓글 남기기