Rails 위에서 Doximity의 15년: 모놀리스 확장, GraphQL, 그리고 개발 문화

Ryan Stawarz & Austin Story: Inside Doximity’s 15-Year Rails Monolith

작성자
Ruby on Rails Youtube
발행일
2025년 08월 12일

핵심 요약

  • 1 Doximity는 15년 이상 Ruby on Rails 모놀리스를 100명 이상의 엔지니어를 지원하는 규모로 확장하며 Rails를 핵심 경쟁력으로 활용하고 있습니다.
  • 2 프론트엔드 전략은 Backbone에서 Vue로 진화했으며, 모바일 클라이언트를 위해 GraphQL을 도입하고 Federation을 통해 대규모 서비스 통합 문제를 해결했습니다.
  • 3 실시간 기능, 데이터 관리, 개발 문화에 대한 실용적인 접근 방식을 통해 빠른 개발 속도와 높은 신뢰성을 유지하고 있습니다.

도입

본 에피소드에서는 Doximity가 15년 이상 Ruby on Rails를 기반으로 의료 전문 네트워크 플랫폼을 구축하고 유지하며 겪은 기술적 결정과 성장 과정을 심층적으로 다룹니다. 특히 100명 이상의 엔지니어를 지원하는 단일 Rails 모놀리스를 어떻게 성공적으로 확장했는지, 그리고 Rails가 모바일 우선 플랫폼의 핵심 경쟁력으로 작용한 이유를 Ryan Stayars와 Austin Story의 경험을 통해 조명합니다.

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 업그레이드 과정은 프레임워크의 깊이를 이해하고 실질적인 지식을 습득하는 중요한 기회가 됩니다.

결론

Doximity는 Ruby on Rails의 강력한 기능과 유연성을 바탕으로 대규모 의료 전문 네트워크 플랫폼을 성공적으로 확장하고 진화시켜 왔습니다. 검증된 프레임워크를 기반으로 한 실용적인 기술 선택, GraphQL Federation을 통한 서비스 복원력 강화, 그리고 개방적이고 신뢰 기반의 개발 문화는 Doximity가 빠르게 시장에 제품을 출시하고 사용자 요구에 신속하게 대응하는 핵심 동력이었습니다. Rails는 Doximity가 지속적인 혁신과 성장을 이루는 데 없어서는 안 될 '비밀 병기'로 자리매김하고 있습니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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