아티클은 복잡한 보고서 생성 시 원시 SQL(특히 CTE)이 ActiveRecord보다 우월한 이유를 설명합니다. CTE는 임시 뷰와 유사하게 작동하여 다단계 데이터 변환을 가능하게 하며, 운영 데이터를 보고서에 적합한 형식으로 효과적으로 전환하는 데 필수적입니다. ‘팀별 독자 수’ 보고서 예시를 통해 message_readership
, message_team_metrics
, team_readership
과 같은 여러 CTE를 사용하여 데이터를 점진적으로 정제하는 과정을 시연합니다. 최종 SQL 쿼리 결과는 dry-struct
객체(TeamReadership
)로 매핑되어 타입 안정성을 제공하고, 뷰 레이어에서 일반 해시를 다루는 것보다 훨씬 쉽게 데이터를 조작할 수 있도록 합니다.
더 나아가, 아티클은 전체, 메시지별, 팀별 지표를 포함하는 더 복잡한 대시보드 예시를 제시합니다. 이 대시보드는 ‘Staging CTEs’와 ‘Dashboard CTEs’라는 두 단계의 CTE 접근 방식을 사용하여 구현되며, Postgres의 JSON 함수를 활용하여 모든 집계된 지표를 단일 JSON 문서로 반환합니다. 이 JSON 출력은 중첩된 dry-struct
객체(MessageMetric
, TeamMetric
, OverallMetric
, Dashboard
)로 변환되어 Ruby에서 완전히 구조화되고 타입이 검증된 대시보드 객체를 생성합니다.
또한, 기존 ActiveRecord 스코프를 SQL 쿼리에 통합하여 비즈니스 로직 중복을 방지하는 방법과, 복잡한 SQL 쿼리의 성능을 최적화하기 위한 전략(초기 필터링, CTE 간 필터 중복, CTE를 임시 테이블 및 인덱스로 변환)을 제공합니다.
dry-struct
의 가장 큰 장점 중 하나는 데이터 소스로부터 데이터 형태를 분리하는 능력입니다. dry-struct
객체는 실시간 SQL 쿼리, 데이터 웨어하우스(Redshift, BigQuery, SnowFlake), 수동으로 작성된 YAML/JSON 테스트 데이터, 또는 Faker 기반의 데모 환경 생성기 등 다양한 소스에서 채워질 수 있습니다. 이러한 유연성은 실제 데이터 없이 대시보드를 설계하고 테스트하며, 작동하는 데모를 쉽게 제공하고, 단위 테스트 시 데이터베이스 목업 없이 테스트 값을 사용하여 구조체를 인스턴스화할 수 있게 합니다.