Rails 모놀리스의 역사: Zendesk의 17년간의 여정

C. Planas, A. Mikhaylov, "2000 engineers, 2 millions lines of code: the history of a Rails monolith"

작성자
EuRuKo
발행일
2025년 01월 13일

핵심 요약

  • 1 Zendesk는 17년간 Rails 모놀리스를 기반으로 성장하며, 확장성, 데이터베이스 성능, 테스팅 및 업그레이드 등 다양한 기술적 도전을 겪었습니다.
  • 2 특히 데이터베이스는 Ruby보다 훨씬 큰 병목 현상이었으며, 방대한 테스트 스위트와 체계적인 배포 파이프라인이 안정성 유지에 필수적이었습니다.
  • 3 메타 프로그래밍과 '선점자 불리'는 업그레이드의 주요 난관이었으나, 과거의 경험을 통해 배우되 갇히지 않는 태도가 미래를 위한 현명한 접근 방식임을 강조합니다.

도입

이 발표는 Zendesk의 크리스티안(Christian)과 아나톨리(Anatolii)가 자사 Rails 모놀리스의 17년 역사를 공유하며, Ruby 커뮤니티의 독특한 특성과 기술적 여정에서 얻은 교훈을 제시합니다. Zendesk는 창립 이래 주력 제품에 Ruby on Rails 모놀리스를 적극적으로 활용해왔으며, 이는 그들의 아키텍처와 운영 방식에 지대한 영향을 미쳤습니다. 발표는 단순한 기술적 회고를 넘어, 기술 생태계의 변화 속에서 Zendesk가 어떻게 적응하고 진화해왔는지를 상세히 다룹니다.

Zendesk의 아키텍처는 초기 ‘공유 로직을 가진 Rails 앱 세트’에서 시작하여, 인수 합병에 따른 ‘서비스 데이터’ 공유, 그리고 현재의 ‘이벤트 기반 아키텍처(Kafka)’로 점진적으로 진화했습니다. 이는 마이크로서비스의 유행 속에서도 모놀리스의 장점을 유지하면서 필요한 경우에만 서비스를 분리하는 실용적인 접근 방식을 따랐음을 보여줍니다. 특히, 제이슨 워너(Jason Warner)의 스펙트럼 비유처럼, 스타트업 초기에는 빠른 반복을 위해 모놀리스가 유리하며, 시장 적합성을 찾은 후 점진적으로 분리하는 것이 바람직하다는 관점을 Zendesk의 경험을 통해 뒷받침합니다.

데이터베이스는 Zendesk의 시스템에서 Ruby 자체보다 훨씬 큰 병목 현상으로 작용했습니다. 방대한 데이터 세트를 관리하기 위해 Zendesk는 샤딩(sharding)과 활성/비활성 데이터(active/non-active data)의 명확한 구분을 도입했습니다. 아나톨리는 데이터베이스의 세 가지 핵심 속성(성능, 쿼리 처리 능력, 데이터 저장 용량) 중 두 가지만을 동시에 만족시킬 수 있다는 물리적 한계를 강조하며, Zendesk가 이 한계 속에서 어떻게 데이터 관리 전략을 진화시켰는지 설명합니다. 즉, Ruby는 느리지 않으며, 데이터베이스가 시스템 성능의 핵심 요소임을 역설합니다.

안정성과 품질 유지를 위해 Zendesk는 광범위한 테스팅을 핵심 가치로 삼고 있습니다. 160만 라인 이상의 코드와 5만 5천 개 이상의 테스트를 보유하고 있으며, MiniTest의 개발자이자 유지보수자인 라이언 데이비스(Ryan Davis)의 주도하에 MiniTest를 적극적으로 활용합니다. MiniTest는 빠르고, 작으며, ‘마법’이 적다는 장점으로 Zendesk의 방대한 테스트 환경에 최적화되어 있습니다. 배포 파이프라인은 스테이징(staging)에서의 통합 테스트, 카나리(canary) 배포, 그리고 모든 프로덕션 포트(pot)에 걸친 표준 테스트 스위트 실행 등 다단계 검증 과정을 거칩니다. 총 3시간이 소요되는 이 과정은 안정적인 서비스 제공을 위한 Zendesk의 노력을 보여줍니다. 또한, GitHub의 코드 오너(code owners) 기능을 통해 코드 책임자를 명확히 하여, 570명 이상의 커미터가 참여하는 대규모 코드베이스의 혼란을 방지하고 협업을 효율화합니다.

오랜 기간 Rails를 사용해온 만큼, Rails 버전 업그레이드는 Zendesk의 중요한 도전 과제였습니다. Rails 1.0부터 현재 7.1/7.2 버전까지 업그레이드를 이어온 비결은 ‘솔직한 테스팅’입니다. 현재 버전과 다음 버전에 대해 동시에 테스트를 실행하여 회귀(regression)를 방지하는 전략을 사용합니다. 초기에는 메타 프로그래밍(meta-programming)과 몽키 패칭(monkey patching)이 업그레이드의 주요 걸림돌이 되었으며, 특히 Rails 4에서 5로의 업그레이드는 2년 반이라는 긴 시간이 소요될 정도로 어려웠습니다. 이는 코드의 ‘마법’을 줄이고 단순화하는 방향으로 전환하는 계기가 되었습니다. 또한, Zendesk가 자체적으로 개발했던 기능들(예: strong parameters, sharding)이 Rails에 공식적으로 통합되면서 기존 구현을 대체해야 하는 ‘선점자 불리(first-move disadvantage)’를 겪기도 했습니다. 이러한 경험을 바탕으로, 새로운 기능을 개발할 때는 커뮤니티와 소통하고 협력하는 것이 중요하다는 교훈을 강조합니다.

결론

결론적으로, 이 발표는 확장성이 단순히 성능 문제에 국한되지 않고, 조직 운영과 아키텍처 결정의 복합적인 문제임을 시사합니다. Zendesk의 17년 Rails 모놀리스 역사는 과거의 경험을 통해 배우는 것의 중요성을 역설합니다. 간달프처럼 과거의 지식이 미래를 인도할 수 있지만, 동시에 사루만이나 '얼어붙은 동굴 인간(Frozen Caveman)' 안티 패턴처럼 과거에 갇히지 않도록 경계해야 함을 강조합니다. 역사를 객관적인 이야기꾼처럼 대하고, 개인적인 자아를 투영하지 않으며, 끊임없이 배우고 진화하는 태도가 장기적인 성공을 위한 핵심임을 역설하며 발표를 마무리합니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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