사일런트 킬러: 위기에서 얻은 교훈

RailsConf 2025 Silent Killers: Lessons from the Brink by Joe Leo

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

핵심 요약

  • 1 성장하는 Rails 애플리케이션에서 발생하는 숨겨진 문제인 '사일런트 킬러'와 그 원인인 안티패턴을 다룹니다.
  • 2 표면적 모듈성, 거대 클래스, 데이터베이스에 숨겨진 로직 등 주요 안티패턴과 실제 사례를 통해 문제점을 분석합니다.
  • 3 ActiveResource, 서비스 클래스 분리, 테스트 강화, DevOps 지표 활용 등 Rails 앱의 생존과 건강한 발전을 위한 구체적인 해결 전략을 제시합니다.

도입

본 강연은 Def Method의 CEO이자 'The Well-Grounded Rubist'의 공동 저자인 Joe Leo가 성장하는 Rails 애플리케이션에 내재된 '사일런트 킬러(Silent Killers)'에 대해 논합니다. 이들은 처음에는 사소해 보이나 시간이 지남에 따라 애플리케이션의 존재론적 위협으로 발전하는 문제들을 의미합니다. 강연은 이러한 안티패턴을 식별하고, 피하며, 효과적으로 해결하여 Rails 애플리케이션의 생존과 건강한 발전을 보장하는 전략을 제시하는 데 중점을 둡니다. 특히 Rails 환경에서 발생하는 특유의 도전 과제와 해결책에 초점을 맞춥니다.

강연은 세 가지 핵심 안티패턴과 실제 사례를 통해 문제점과 해결 과정을 설명합니다.

첫 번째는 ‘표면적 모듈성(Modularity Mirage)’입니다. 이는 두 개의 Rails 앱이 겉으로는 분리되어 보이지만, 실제로는 직접적인 데이터베이스 종속성으로 인해 동기화 문제, 취약한 테스트 환경, 팀 신뢰도 하락을 야기한 사례입니다. 해결책으로 ActiveResource를 통해 API 기반 데이터 통신으로 전환하여 데이터베이스 결합을 해소하고, VCR/Pact를 활용한 API 계약 테스트를 도입했습니다. 또한, 공유 로직을 프라이빗 젬으로 추출하여 배포 환경 설정을 자동화하고, DORA metrics를 통해 아키텍처 건전성을 모니터링했습니다. 이 사례는 겉보기 모듈성의 위험성과 공유 데이터베이스의 숨겨진 위험, 그리고 DevOps 지표의 중요성을 강조합니다.

두 번째는 ‘거대 클래스(Leviathan Classes)’입니다. 이는 ‘갓 클래스(God classes)’로 불리며, 단일 클래스가 과도한 책임과 종속성을 가져 유지보수 및 기능 확장이 어려운 경우입니다. 마켓플레이스 앱 사례에서는 불안정한 CI 빌드, JS 테스트 부재, 무시된 코드 품질 경고, 과도한 모델 종속성 등이 문제였습니다. 해결을 위해 백엔드에서는 비즈니스 로직을 서비스 클래스(interactor gem)와 상태 관리(Statesman gem)로 분리하여 모델의 책임을 경감했습니다. 프론트엔드에서는 Redux 연결을 모듈화하고 React Testing Library를 도입하여 테스트를 강화했습니다. 또한, 코드 품질 지표에 대한 신뢰를 회복하고 새로운 코드에 대한 테스트 커버리지 목표를 설정했습니다. 강연은 무시된 복잡성이 증폭되며, 건강한 시스템은 안전하고 신속한 변경을 가능하게 해야 함을 역설합니다.

세 번째는 ‘숨겨진 로직(Silt Below)’입니다. 이는 애플리케이션 로직이 structure.sql 파일 내 PostgreSQL 함수나 컨트롤러의 원시 SQL 쿼리처럼 데이터베이스 계층에 깊이 파묻혀 있는 문제입니다. 이는 과도한 정규화와 전문가 의존성을 초래하여 개발 속도를 저하시킵니다. 오래된 Rails 앱 사례에서 발견되었으며, 제안된 해결책은 데이터베이스 함수를 식별 및 분류하고, schema.rb로 전환하여 데이터베이스 로직을 애플리케이션 계층으로 가져오는 것입니다. 또한, 중요한 함수에는 계약 테스트를 추가하고, 원시 SQL을 Active Record 스코프나 ARL로 점진적으로 대체하며, 서비스 객체와 캐싱을 활용하는 방안을 제시합니다. 이 안티패턴은 structure.sql에 대한 면밀한 검토와 Rails 컨벤션 및 임베디드 데이터베이스 로직 혼합의 위험성을 경고합니다.

결론

강연자는 이러한 위기 경험이 팀을 더욱 현명하게 만든다고 강조합니다. 잔잔한 바다에도 숨겨진 위험이 존재하듯이, 개발팀은 끊임없이 경계하고 준비해야 합니다. 시스템의 진정한 건강은 안전하고 신속하게 변경할 수 있는 능력에 달려 있으며, 이는 비즈니스 요구사항에 맞춰 진화하고 확장할 수 있는 탄력적인 시스템을 구축하는 데 필수적입니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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