우리의 애플리케이션 '탈선'시키기

RailsConf 2025 Derailing Our Application: How and Why We... by Fito von Zastrow, Alan Ridlehoover

작성자
Ruby Central
발행일
2025년 07월 24일

핵심 요약

  • 1 대규모 Rails 애플리케이션에서 비즈니스 로직이 Rails 구조에 얽혀 복잡성과 테스트 용이성 문제를 야기했습니다.
  • 2 컨트롤러, 뷰, 모델에서 비즈니스 로직을 Plain Old Ruby Objects (PORO)로 추출하고 도메인별로 모듈화하여 해결했습니다.
  • 3 이 접근 방식은 테스트 커버리지를 97% 이상으로 높이고 코드 복잡성을 30% 낮추며 팀의 자율성과 책임감을 향상시켰습니다.

도입

Cisco Meraki의 Alan Ridleh Hoover와 Fito Fonastro는 대규모 Ruby on Rails 애플리케이션을 운영하며 직면한 문제점과 이를 해결하기 위한 혁신적인 전략을 공유합니다. 이들의 애플리케이션은 초기 Rails 개발 방식과 급격한 성장으로 인해 코드베이스의 복잡성이 증가했으며, 기존 Rails 프레임워크의 구조로는 더 이상 효율적인 관리가 어려워졌습니다. 이에 따라 발표자들은 비즈니스 로직을 Rails의 특정 구조로부터 분리하는 '탈선(derailing)' 전략을 모색하게 되었으며, 이는 애플리케이션의 장기적인 확장성과 유지보수성을 확보하기 위한 필수적인 변화였습니다.

발표자들은 Kent Beck의 3X 모델(탐색, 확장, 추출)을 통해 애플리케이션의 현재 상태를 진단하며 이야기를 시작합니다. Meraki는 2006년 탐색 단계를 시작하여 2012년 Cisco에 인수된 후 급격한 확장 단계를 거쳐 현재 420만 라인의 Ruby 코드와 600명 이상의 월별 기여자를 가진 거대한 시스템으로 성장했습니다. 이 과정에서 초기 Rails 모범 사례가 확립되기 전에 구축된 코드는 거대한 모델과 컨트롤러로 인해 복잡성이 극대화되고 테스트가 어려워지는 문제가 발생했습니다.

이러한 문제를 해결하기 위해 Meraki 팀은 코드베이스를 모듈화하고 모놀리식 아키텍처 내에 명확한 경계를 설정하는 방법을 채택했습니다. 첫째, 거대한 컨트롤러 액션 내부에 있던 비즈니스 로직을 더 작고 테스트하기 쉬운 Plain Old Ruby Objects (PORO)로 추출했습니다. 이는 HTTP 개념과 분리되어 단위 테스트를 용이하게 하고 비즈니스 로직의 테스트 커버리지 ROI를 높이는 데 기여했습니다. 둘째, ERB 파일 내에 혼재되어 있던 비즈니스 로직 역시 PORO로 대체하여 코드 가독성, 테스트 용이성, 그리고 코드 품질 도구의 활용성을 개선했습니다. 셋째, 이른바 ‘뚱뚱한 모델(Fat Models)’이 코드의 ‘쓰레기통(junk drawers)’이 되는 문제를 해결하기 위해 모델에서 핵심 비즈니스 로직을 별도의 클래스로 추출했습니다. 이는 모델 간의 암시적 결합을 줄이고 코드 응집도를 높이는 데 효과적이었습니다.

추출된 PORO들은 더 이상 Rails의 MVC 패턴(컨트롤러, 모델, 뷰)에 따라 분류되지 않고, domain/coffee_machine과 같이 도메인 개념을 기반으로 하는 디렉토리 구조로 재배치되었습니다. 이 접근 방식은 각 팀이 소유한 코드에 대한 자율성과 책임감을 부여하여, 전체 조직의 합의 없이도 개선 작업을 수행할 수 있도록 했습니다. 이러한 노력의 결과로 모듈화된 코드의 테스트 커버리지는 97% 이상으로 크게 증가했으며, 평균 메서드 복잡성은 30% 감소했습니다. 또한, 문제 발생 시 책임 팀을 명확히 함으로써 플래키 테스트와 심각도 1(SEV1) 응답에 대한 개선을 가져왔습니다. 그러나 팀 자율성이 때로는 도메인 외부에서 문제를 야기할 수 있다는 도전 과제도 존재했습니다.

결론

Meraki의 사례는 대규모 레거시 Rails 애플리케이션이 직면하는 복잡성 문제를 극복하고 지속적인 성장을 지원하기 위해 Rails 프레임워크의 제약을 넘어선 아키텍처적 사고와 모듈화 전략이 필수적임을 명확히 보여줍니다. 비즈니스 로직을 Rails 구성 요소로부터 분리하고 도메인 기반의 명확한 경계를 설정함으로써, 코드 품질, 테스트 용이성, 그리고 개발 팀의 효율성을 동시에 향상시킬 수 있었습니다. 이는 궁극적으로 애플리케이션의 장기적인 유지보수성과 확장성을 보장하는 핵심 전략이 됩니다. Meraki는 앞으로도 도메인을 API로 감싸고 모놀리식에서 서비스를 추출하는 등 지속적인 개선을 이어나갈 계획입니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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