모듈형 모놀리스의 신화: 대규모 Rails 애플리케이션의 인간적, 문화적 문제

[Euruko 2025] “Closing Keynote” – Eileen M. Uchitelle (Shopify, USA)

작성자
EuRuKo
발행일
2025년 11월 10일

핵심 요약

  • 1 대규모 Rails 모놀리스의 근본적인 문제는 아키텍처 변경이 아닌 조직의 문화와 인간적 요소에 있으며, 모듈화는 이러한 문제를 해결하는 만능 해결책이 아닙니다.
  • 2 애플리케이션의 규모 확장으로 발생하는 아키텍처, 운영, 조직적 어려움은 기능 출시 우선주의, 기술 부채 방치, 부적절한 개발자 교육 등 잘못된 인센티브 구조에서 비롯됩니다.
  • 3 문제 해결을 위해서는 개발자 교육 강화, Rails 철학 전파, 코드 품질 우선순위 부여, 협업 증진 등 리더십 주도의 엔지니어링 문화 변화가 필수적입니다.

도입

Shopify의 선임 스태프 소프트웨어 엔지니어이자 Rails 및 Ruby 코어 팀 멤버인 Eileen은 15년간 Rails 애플리케이션 개발 경험을 바탕으로 대규모 Rails 모놀리스가 직면하는 문제점과 '모듈형 모놀리스' 아키텍처의 한계를 조명합니다. 그녀는 Basecamp Classic, GitHub, 그리고 세계에서 가장 오래된 지속적으로 개발된 Rails 애플리케이션인 Shopify의 코어 모놀리스에서 얻은 통찰을 공유하며, 시간이 지남에 따라 Rails 애플리케이션이 개발자에게 즐거움을 주지 못하고 '진흙 덩어리(ball of mud)'가 되는 현상을 설명합니다. 많은 기업이 이러한 문제를 해결하기 위해 마이크로서비스나 모듈형 모놀리스를 추구하지만, Eileen은 이러한 아키텍처적 접근 방식이 기대했던 '은총알(silver bullet)'이 되지 못했으며, 근본적인 문제는 기술이 아닌 인간적, 문화적 측면에 있다고 주장합니다.

Eileen은 대규모 Rails 애플리케이션이 겪는 고통점을 아키텍처, 운영, 조직적 문제로 분류하고, 모듈형 모놀리스가 이러한 문제를 해결하는 데 실패하는 이유를 설명합니다.

1. 대규모 Rails 애플리케이션의 고통점

  • 아키텍처 문제:
    • 조직 및 구조 부족: Rails의 기본 MVC 구조만으로는 방대한 코드베이스를 관리하기 어려워 ‘진흙 덩어리(ball of mud)’가 됩니다. 코드의 위치와 리팩토링 우선순위가 명확하지 않아 개념들이 뒤섞입니다.
    • 강한 결합 및 경계 부족: Ruby의 전역 접근성으로 인해 코드 간 강한 결합이 쉽게 발생하며, 이는 예측 불가능한 영향과 개발 생산성 저하를 초래합니다.
  • 운영 문제:
    • 느린 CI 및 불안정한 테스트: 모놀리스 규모가 커질수록 불안정한 테스트(flaky tests)가 빈번해지고 CI 속도가 저하됩니다. 이는 네트워크 호출, 과도한 레코드 생성, 전역 상태 오염 등 다양한 기술 부채에 기인합니다.
    • 배포 확장성 어려움: 애플리케이션 규모 증가 시 배포 시간이 길어지고, 특정 부분만 독립적으로 확장 배포하기 어렵습니다.
  • 조직 문제:
    • 오너십 할당 및 신규 채용 온보딩 어려움: 수천 명의 엔지니어 규모에서 코드 오너십이 불분명하고, 거대한 코드베이스는 신규 개발자에게 큰 진입 장벽이 됩니다.
    • “전체 애플리케이션을 머리에 담을 수 없다”는 주장의 반박: 이는 개인적인 문제이며, 애플리케이션 크기를 판단하는 유효한 기준이 아닙니다. 중요한 것은 잘 설계된 구조와 Rails 컨벤션 준수입니다.

2. 모듈형 모놀리스의 약속과 현실

모듈형 모놀리스는 마이크로서비스의 격리성과 모놀리스의 개발 편의성을 결합하는 이상적인 해결책으로 제시됩니다. Rails Engines와 Packwerk Gem을 사용하여 모듈 간 경계를 정의하고 강제하는 방식이 사용됩니다. 그러나 Eileen은 다음과 같은 문제점들을 지적합니다.

  • 진정한 격리의 어려움: Packwerk는 의존성을 식별하지만, 기존 코드 리팩토링 없이는 결합도 감소나 경계 도입이 어렵습니다. Shopify조차 완전 격리된 모듈을 프로덕션에 배포하지 못하고 있습니다.

  • 안티패턴 유발:

    • 원시 타입 집착(Primitive Obsession): 의존성 위반을 피하기 위해 Active Record 객체 대신 ID를 전달하고 재쿼리하는 패턴으로 인해 데이터베이스 성능 저하와 데이터 중복이 발생합니다.
    • 오너십 집착(Ownership Obsession): 패키지 내 코드가 특정 팀의 전유물이라는 사고방식은 사일로를 만들고 협업을 저해하며 코드 품질을 희생시킵니다.
    • 패키지 집착(Package Obsession) 및 코드 중복: 모든 새로운 개념을 별도 패키지로 만들거나 의존성 회피를 위해 코드를 복사하는 관행은 코드베이스를 파편화하고 비대하게 만들며 유지보수를 어렵게 합니다.
    • 순환 의존성(Circular Dependencies): 대규모 애플리케이션에서 순환 의존성 해결 및 방지는 매우 어려우며, 이를 회피하려다 성능 저하를 초래하기도 합니다.

3. 근본 원인: 인간적, 문화적 문제

Eileen은 이러한 문제들이 코드베이스를 이동하거나 아키텍처를 변경하는 것만으로는 해결되지 않는다고 강조합니다.

  • 문제의 본질: 도구는 문제점을 알려줄 뿐, 더 나은 조직화, 설계, 기술 부채 해결은 개발자의 이해와 교육, 그리고 리더십의 우선순위 설정이 필요합니다.

  • 조직 문화의 영향: 오너십, 온보딩, 책임감 부족 등은 리더십과 회사 문화에 깊이 뿌리내린 문제입니다. 기능 출시 우선주의, 기술 부채 무시, 책임 전가 문화 등 잘못된 인센티브 구조가 문제의 핵심입니다. 아키텍처는 이러한 문화적 문제를 해결할 수 없습니다.

결론

Eileen은 모듈형 모놀리스가 대규모 Rails 애플리케이션의 모든 문제를 해결할 것이라는 기대는 '신화'에 불과하다고 결론 내립니다. 아키텍처 변경만으로는 해결할 수 없는 인간적, 문화적 문제들이 근본 원인이라는 것입니다. 이러한 문제들은 기능 출시만을 최우선하고, 코드 품질을 등한시하며, 기술 부채를 방치하고, 개발자 교육에 소홀하며, 책임 전가 문화를 조장하는 조직 구조와 리더십의 실패에서 비롯됩니다. 진정한 해결책은 다음과 같습니다. * **개발자 교육 강화:** Rails의 철학, 설계 원칙, 컨벤션 준수 방법 등을 신규 개발자에게 체계적으로 교육해야 합니다. * **Rails 철학 전파(Indoctrination):** Rails가 왜 위대한 프레임워크인지, 그 설계 의도가 무엇인지 적극적으로 알리고, 개발자들이 Rails에 대한 사랑과 이해를 갖도록 해야 합니다. * **품질 우선순위 부여:** 리더십은 기능 출시만큼 코드 품질 개선, 기술 부채 해결, 유지보수 작업을 중요하게 여기고, 이러한 '보이지 않는 작업'에 대한 보상과 인정을 제공해야 합니다. * **협업 증진:** 책임 전가 대신 협업 문화를 구축하여 팀 간 사일로를 제거하고, 코드베이스를 공유된 책임으로 인식하도록 해야 합니다. 궁극적으로 아키텍처는 인간적, 문화적 문제를 해결할 수 없지만, 인간적, 문화적 문제를 해결하면 아키텍처, 운영, 조직적 문제를 개선할 수 있습니다. Eileen은 대규모 Rails 모놀리스를 포용하고, 엔지니어링 문화에 투자하며, 개발자들이 대규모 환경에서도 Rails 프로그래밍의 즐거움을 되찾을 수 있도록 노력해야 한다고 강조하며 연설을 마무리합니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

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