Ruby로 무언가를 구현해야 한다면, 이미 그 기능을 담당하는 젬(gem)이 존재할 가능성이 높습니다. 사실 하나가 아니라 열두 개쯤 존재하죠. 어떤 젬은 우아하고 기능이 풍부하며 꾸준히 관리되는 반면, 어떤 젬은 작성자가 한 번 겪은 특정 상황을 해결하려고 급조된 것입니다. 선택지가 워낙 많다 보니 '올바른' 젬을 어떻게 고를지가 중요한 문제가 됩니다. 이 선택은 결코 가볍지 않습니다. 프로젝트에 젬을 추가한 뒤 후회하게 되면, 되돌리는 과정이 매우 고통스럽기 때문입니다.
통계부터 확인하세요
문제를 해결해 줄 라이브러리가 필요할 때 저는 항상 Ruby Toolbox부터 찾아봅니다. Ruby Toolbox는 '구독 관리(Subscription Management)' 같은 카테고리에 속한 모든 젬 목록을 한눈에 보여주는 훌륭한 도구입니다. 여기서 다음 두 가지를 먼저 확인해야 합니다.
얼마나 많은 사람이 사용하는가?
인기 있는 젬에는 분명 그럴 만한 이유가 있습니다. 또한 인터넷의 다른 개발자들이 같은 젬을 사용하고 있다면 도움을 받기도 훨씬 수월합니다.
얼마나 최근에, 얼마나 자주 업데이트되는가?
꾸준히 업데이트되는 젬인지 확인하세요. Rails 3.2 호환성 업그레이드가 아직도 풀 리퀘스트 대기열에 잠들어 있다면 의심해 봐야 합니다. 마지막 릴리스가 몇 년 전이라면 과감히 건너뛰는 것이 좋습니다. 어차피 여러분의 애플리케이션과 호환되지 않을 가능성이 큽니다.
이 두 가지 기준으로 필터링하면 실제로 검토할 젬 후보 목록이 만들어집니다. Ruby Toolbox는 소스 코드, 공식 문서, 웹사이트, 버그 트래커로 연결되는 링크도 함께 제공하므로, 다음 단계에서 유용하게 활용할 수 있습니다.
코드와 문서를 꼼꼼히 들여다보세요
문서화가 잘 되어 있는가?
공식 웹사이트가 있다면 방문해 보세요. 문서의 품질은 어떤가요? RDoc은 제대로 갖춰져 있나요? 필요할 때 필요한 답을 찾을 수 있을까요?
테스트가 충분한가?
테스트 코드를 직접 살펴보세요.
test/나spec/디렉터리조차 없진 않은지,test_truth수준을 넘어서는 테스트가 있는지 확인하세요. 회귀 버그가 생겼을 때 작성자가 알아차릴 수 있을까요?이슈와 풀 리퀘스트를 확인하세요
버그가 빠르게 수정되는 편인가요? 이슈와 풀 리퀘스트에 활발한 논의가 오가며 실제로 해결되나요? 아니면 그저 방치되어 있나요?
Google, Stack Overflow, Reddit에서 젬 이름을 검색해 보세요
사람들이 이 젬에 대해 어떻게 말하는지 확인하세요. 어떤 젬이 추천되고, 어떤 젬은 피하라고 조언되는지 파악하는 것만으로도 큰 도움이 됩니다.
GitHub에서 젬이 제공하는 클래스 몇 개를 검색해 보세요
실제 애플리케이션에서 해당 클래스들이 어떻게 사용되는지 살펴보세요. 사용하기 쉬워 보이나요? 아니면 다른 개발자들이 젬의 문제를 우회하느라 억지로 코드를 짜맞추고 있나요?
여기까지 진행했다면 후보는 몇 개 정도로 좁혀졌을 것입니다.
감각적으로 판단해야 할 부분
다음 기준들은 다소 주관적입니다. 그래서 결국 여러분의 프로젝트에 맞는 젬을 직접 찾아야 하는 것이죠. 하지만 이 부분을 놓치면 나중에 반드시 후회하게 됩니다.
문서의 예제 코드를 봤을 때 루비답게 느껴지는가?
루비 관용구(idiom)를 자연스럽게 활용하나요? 아니면 Java나 PHP 코드를 작성하는 듯한 느낌이 드나요? 안타깝게도 이런 일은 API 래퍼(wrapper)에서 놀랄 만큼 자주 발생합니다.
잘 조합되는 작은 부품들로 이루어져 있는가?
작성자가 제공한 객체들을 조합해서 작성자가 상상하지 못한 무언가를 만들 수 있나요? 어차피 여러분은 언젠가 그렇게 하고 싶어질 테니까요.
프로젝트에 이미 포함된 다른 젬이 의존하고 있는 젬인가?
그렇다면 행운입니다. 통합에 드는 시간을 아낄 수 있고, Bundler와 버전 충돌로 씨름할 일도 없다는 뜻이니까요.
젬이 여러분의 앱에 대해 특정 가정을 하고 있는가? 그 가정은 계속 유효한가?
ActiveResource처럼 통신 대상 서버의 API에 대한 가정을 깔고 있는 젬이 있습니다. ResourceController처럼 컨트롤러의 동작 방식을 가정하는 젬도 있죠. 가정에 기반한 젬은 그 가정이 유지되는 한 개발 속도를 크게 높이고 코드를 단순하게 만들어 줍니다. 하지만 그 가정이 앱과 맞지 않게 되는 순간, 며칠씩 몽키 패칭(monkey patching)과 디버깅에 시달리다가 결국 젬을 걷어내게 될지도 모릅니다.
기준이 너무 많다고요?
네, 프로젝트에 가장 적합한 젬을 고르기 위한 기준이 정말 많습니다. 하지만 모든 기준을 매번 확인할 필요는 없습니다. 대부분의 경우 Ruby Toolbox에 접속해서 가장 인기 있는 젬을 고르는 것만으로 충분합니다.
다만 앱의 핵심 부분이 되는 젬들이 있습니다. HTTP 라이브러리, 데이터베이스 라이브러리, 혹은 컨트롤러를 더 깔끔하게 만들어 주겠다고 약속하는 무엇이든요. 바로 이런 젬들에 대해서는 추가 시간을 들여, 깔끔하게 잘 관리되고 문서화가 잘 되어 있으며 여러분이 생각하는 '올바른' 동작 방식과 부합하는지 반드시 확인할 가치가 있습니다.
저는 이 모든 기준을 Google 스프레드시트로 정리해 두었습니다. 비슷해 보이는 젬이 너무 많아 선택이 어려울 때 손쉽게 비교해 볼 수 있습니다.