;

Malloy로 DuckDB 분석 쿼리와 지표 정의를 함께 관리하기 본문

Programing

Malloy로 DuckDB 분석 쿼리와 지표 정의를 함께 관리하기

WindowsHyun 2026. 7. 25. 11:05
반응형

데이터 팀에서 같은 지표를 SQL마다 다시 쓰기 시작하면 숫자가 조금씩 달라집니다. on_time_rate처럼 제외 조건까지 포함한 지표는 특히 그렇습니다. Malloy는 이런 정의를 시맨틱 모델로 고정하고, 기존 SQL 엔진에서 쿼리를 실행하는 오픈소스 언어입니다.

개요

Malloy는 SQL을 대체할 새 데이터베이스가 아닙니다. BigQuery, Snowflake, DuckDB, PostgreSQL, MySQL 등 기존 엔진에 SQL을 생성해 실행합니다. 데이터 이동 없이 모델과 쿼리 문법만 추가하는 구조입니다. 저는 지표 정의가 여러 대시보드와 분석 스크립트로 흩어진 팀에 맞는 선택이라고 봅니다.

모델에는 관계, 변환, measure를 두고 쿼리에는 필요한 group_by와 aggregate만 씁니다. 한 번 정의한 measure는 다음 분석에서도 같은 이름으로 호출합니다. 이 글은 DuckDB 파일을 집계하는 CLI 경로만 다룹니다.

1. Malloy가 필요한 지점

SQL 파일 몇 개를 관리하는 작은 작업에는 Malloy를 추가할 이유가 약합니다. 쿼리 한두 개와 지표 한두 개라면 SQL이 더 짧습니다.

반대로 매출, 활성 사용자, 전환율처럼 정의가 길고 재사용되는 지표가 많다면 모델을 분리할 가치가 생깁니다. Malloy는 모델과 쿼리를 합성할 수 있고, nested data와 파이프라인을 문법에 포함합니다. malloydata/malloy의 최신 릴리스는 v0.0.425이며 Node.js 20 이상을 요구합니다.

2. 사전 준비 사항

Node.js 20 이상과 npm이 필요합니다. CLI는 malloy-cli 패키지로 제공됩니다. 전역 설치가 부담되면 프로젝트 의존성으로 넣어도 됩니다.

npm install -g malloy-cli
malloy-cli --help

레지스트리 확인 결과 CLI 버전은 0.0.38입니다. 라이브러리 패키지 @malloydata/malloy와 릴리스 버전은 따로 움직일 수 있으므로 설치 전 버전을 확인해주시면 됩니다.

npm view malloy-cli version
npm view @malloydata/malloy version engines

앞선 포스트에서 구성한 Docker MongoDB Replica Set처럼 운영 DB에 바로 붙일 때는 읽기 전용 계정과 별도 분석 연결을 먼저 준비하는 편이 좋습니다.

3. DuckDB 모델 작성

orders.parquet 파일을 읽어 상태별 주문 수와 매출을 집계하는 최소 모델입니다. 중요: source에는 데이터 위치와 재사용할 measure를 둡니다. run 블록은 모델을 읽어 결과 모양만 정합니다.

source: orders is duckdb.table('orders.parquet') extend {
  measure:
    order_count is count()
    total_amount is amount.sum()
}

run: orders -> {
  group_by: status
  aggregate: order_count, total_amount
}

파일을 orders.malloy로 저장한 뒤 실행합니다.

malloy-cli run orders.malloy
malloy-cli compile orders.malloy

run은 결과를 반환하고 compile은 생성 SQL을 보여줍니다. SQL 검토가 필요한 팀은 compile 결과를 코드 리뷰에 붙이면 됩니다. Malloy는 기존 엔진을 사용하므로 권한, 비용, 쿼리 실행 제한도 해당 엔진의 규칙을 그대로 따릅니다.

4. 적용 대상

DuckDB 파일 분석, BigQuery나 Snowflake의 반복 지표, BI 도구와 애플리케이션이 같은 정의를 공유해야 하는 환경에 맞습니다. Publisher를 쓰면 .malloy 모델을 REST와 MCP API로 제공할 수도 있습니다.

반면 일회성 조사 SQL, DB마다 다른 고유 문법을 깊게 쓰는 작업, 데이터 모델 소유자가 없는 조직에는 도입 비용이 먼저 보입니다. 모델 변경도 코드 변경이므로 리뷰와 배포 흐름이 필요합니다.

확인

malloy-cli compile orders.malloy 실행 뒤 DuckDB용 SQL이 출력되면 모델 해석 경로는 정상입니다. malloy-cli run orders.malloy 결과에 status, order_count, total_amount 열이 나타나는지 확인하시면 됩니다.

반응형
Comments