강연은 세 가지 핵심 안티패턴과 실제 사례를 통해 문제점과 해결 과정을 설명합니다.
첫 번째는 ‘표면적 모듈성(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 컨벤션 및 임베디드 데이터베이스 로직 혼합의 위험성을 경고합니다.