Rails의 지속적인 선택 이유
Ryan과 Austin은 Rails를 지속적으로 사용하는 이유로 ‘검증된 경로’와 뛰어난 ‘유연성’을 꼽습니다. Rails는 개발자가 아이디어를 신속하게 구현하고 필요한 경우 비즈니스 로직에 맞춰 프레임워크를 맞춤 설정할 수 있는 강력한 기반을 제공합니다. 특히 Rails의 ‘오마카세(Omakase)’ 철학과 높은 생산성은 다른 프레임워크와 차별화되는 강점으로, 초기 아이디어를 엔터프라이즈 수준의 서비스로 발전시키는 데 핵심적인 역할을 합니다.
조직 규모 확장과 GraphQL 도입
2016년 20명 미만이던 Doximity의 엔지니어링 팀은 현재 100~150명의 Rails 엔지니어를 포함하는 대규모 조직으로 성장했습니다. 이러한 성장에 발맞춰 프론트엔드 전략은 jQuery와 Backbone에서 Vue.js로 진화했습니다. Vue.js 기반의 단일 페이지 웹 애플리케이션과 네이티브 모바일 앱을 지원하기 위해 GraphQL이 도입되었습니다. GraphQL은 REST API의 버전 관리 및 변경 사항으로 인한 모바일 앱 충돌 문제를 해결하고, 표준화된 백엔드 인터페이스를 제공하여 모바일 클라이언트 지원과 팀 간 협업을 용이하게 했습니다. 특히 graphql-ruby
젬을 활용하고, N+1 쿼리 문제 해결을 위해 Shopify의 batch_loader
와 같은 배치 로딩 메커니즘을 적용하여 성능 최적화를 이루었습니다.
GraphQL Federation으로의 전환 및 서비스 분리 전략
초기에는 단일 Rails 모놀리스 내에서 GraphQL을 운영했으나, 외부 마이크로서비스를 모놀리스에 수동으로 매핑하는 복잡성(개발 생산성 저하)과 서비스 간의 강한 의존성으로 인한 복원력 문제를 겪었습니다. 이를 해결하기 위해 GraphQL Federation으로 전환했습니다. Federation은 각 도메인 서비스가 독립적인 GraphQL 스키마를 노출하고, 게이트웨이가 이들을 통합하여 단일 엔드포인트를 제공하는 방식입니다. 이를 통해 서비스 간의 결합도를 낮추고 각 서비스의 독립적인 배포 및 운영을 가능하게 하여 전반적인 시스템의 복원력을 크게 향상시켰습니다.
새로운 서비스를 개발할 때 Doximity는 ‘실용성’을 최우선으로 고려합니다. 빠른 출시와 기존 데이터 접근이 필요한 경우 packwerk
젬을 활용하여 모놀리스 내에 격리된 형태로 기능을 구현합니다. 반면, HIPPA 규정 준수와 같은 특수 요구사항이나 독립적인 서비스 운영 및 높은 가용성이 필수적인 ‘Residency Navigator’와 같은 핵심 제품은 별도의 Rails 애플리케이션으로 분리합니다. 이는 유지보수 비용과 배포 복잡성을 고려한 전략적인 결정입니다.
데이터 관리 및 개발 문화
대규모 데이터베이스 스키마 변경 시에는 데이터 마이그레이션을 위한 별도의 비동기 작업을 수행합니다. departure
젬은 pt-online-schema-migrator
를 래핑하여 대규모 테이블 잠금 없이 안전한 온라인 스키마 변경을 지원합니다. 개발 환경에서는 seed scripts
를 통해 현실적인 데이터를 제공하며, Docs Tasks
엔진과 Rakei
젬을 활용하여 개발자가 특정 테스트 데이터를 손쉽게 생성하고 관리할 수 있도록 지원합니다. 이는 QA 및 디버깅 과정을 효율화하는 데 기여합니다.
Doximity의 개발 문화는 ‘적응적’이며 높은 ‘신뢰’를 기반으로 합니다. 팀은 문제 발생 시 자율적으로 해결 방안을 모색하고, ‘needs assessments’ 및 ‘technical proposals’과 같은 문서를 통해 아이디어를 공유합니다. 비공식적인 오프사이트 모임은 팀 간의 소통과 협력을 촉진하는 중요한 역할을 합니다. 분기별 계획을 통해 프로젝트 우선순위를 명확히 하고, 작은 단위의 기능 배포를 통해 유연성을 확보하며, 지속적인 피드백과 개선을 통해 개발 프로세스를 최적화합니다.
Rails의 경쟁력과 학습
Rails는 Doximity의 경쟁 우위 확보에 결정적인 역할을 했습니다. 프레임워크의 실용적인 특성과 빠른 개발 속도, 그리고 프론트엔드(Vue.js)와 같은 외부 기술과의 유연한 통합 능력은 Doximity가 시장 요구에 신속하게 대응하고 혁신적인 제품을 출시하는 데 기여했습니다. Rails 학습에 있어 모든 것을 알 필요는 없으며, 실제 문제를 해결하는 과정에서 디버거를 활용하고 코드를 분석하며 배우는 것이 가장 효과적이라고 강조합니다. 특히 Rails 업그레이드 과정은 프레임워크의 깊이를 이해하고 실질적인 지식을 습득하는 중요한 기회가 됩니다.