CQL(연속 질의 언어): 스트림에 SQL 문법을 얹는 법

CQL과 SQL의 차이, 윈도우 연산·스트림 조인·패턴 매칭 문법, 금융·IoT·텔레콤 활용 사례와 Apache Flink 등 구현 플랫폼을 정리한다.

2026-08-13 · 최초 발행 2025-05-23

CQL은 지속적으로 발생하는 데이터 스트림에 실시간 분석을 수행하기 위한 선언적 쿼리 언어다. 기존 SQL 구문과 비슷하지만 시간 기반 윈도우 개념을 도입해 스트리밍 데이터 처리에 최적화됐다. IoT, 금융 거래, 로그 분석, 실시간 모니터링처럼 데이터가 지속적으로 발생하는 영역에서 쓰이며, 데이터가 발생하는 즉시 처리하고 지정된 조건에 따라 자동으로 쿼리를 실행한다.

정적 테이블과 스트림, SQL과 CQL이 갈리는 지점

  • 데이터 모델: SQL은 정적 테이블 기반, CQL은 동적 스트림 기반
  • 처리 방식: SQL은 저장된 데이터에 쿼리(Data-to-Query), CQL은 입력되는 데이터에 지속적으로 쿼리를 적용(Query-to-Data)
  • 결과 생성: SQL은 한 번 쿼리해 결과를 도출, CQL은 지속적으로 결과를 갱신
  • 시간 개념: CQL은 시간 윈도우(Time Window) 개념이 핵심 요소로 작용
데이터 소스데이터 스트림CQL 엔진지속적 결과알림/액션정적 데이터SQL 엔진일회성 결과

시간과 개수로 자르는 윈도우 연산

시간 기반 윈도우(Time-based Window)는 특정 시간 간격 내의 데이터만 처리한다(예: 최근 5분 데이터).

SELECT * FROM DataStream WINDOW(TIME, 5 MINUTES)

개수 기반 윈도우(Count-based Window)는 지정된 개수의 최신 이벤트만 처리한다(예: 최근 100개 이벤트).

SELECT * FROM DataStream WINDOW(COUNT, 100)

슬라이딩 윈도우(Sliding Window)는 일정 간격으로 윈도우를 이동하며 분석한다.

SELECT * FROM DataStream WINDOW(TIME, 5 MINUTES, SLIDE 1 MINUTE)

텀블링 윈도우(Tumbling Window)는 겹치지 않는 고정 크기 윈도우로 데이터를 분할한다.

SELECT * FROM DataStream WINDOW(TIME, 5 MINUTES, TUMBLING)

윈도우 유형5분 간격100개 이벤트1분마다 이동겹치지 않음시간 기반 윈도우최근 5분 데이터개수 기반 윈도우최근 100개 이벤트슬라이딩 윈도우겹치는 시간 구간텀블링 윈도우분리된 시간 구간

여러 스트림을 실시간으로 엮는 조인

CQL은 여러 데이터 스트림을 실시간으로 조인해 상관관계를 분석할 수 있다. 시간 기반 조인으로 특정 시간 범위 내 발생한 이벤트 간 연관성을 파악하며, 사용자 행동 데이터와 시스템 로그 스트림을 조인하는 것이 대표적인 예다.

SELECT a.userId, a.action, b.systemStatus
FROM UserActionStream a JOIN SystemLogStream b
ON a.userId = b.userId
WINDOW(TIME, 30 SECONDS)

패턴 매칭으로 잡아내는 복잡한 상황

스트림 내 특정 이벤트 패턴을 감지하면 복잡한 상황을 인식할 수 있다. 순차적 이벤트 패턴, 반복 패턴, 조건부 패턴 등을 정의할 수 있으며 신용카드 부정 사용 탐지, 시스템 장애 조기 감지 등에 쓰인다.

SELECT * FROM TransactionStream
MATCH_RECOGNIZE (
    PARTITION BY cardId
    ORDER BY eventTime
    MEASURES A.amount AS first_amount, B.amount AS second_amount
    PATTERN (A B C)
    DEFINE
        A AS A.amount > 1000,
        B AS B.amount > 500 AND B.country != A.country,
        C AS C.amount > 200 AND C.timeGap < 60
)

금융 사기 탐지에서 스마트 빌딩까지

금융 분야에서는 비정상적인 거래 패턴을 즉시 감지하는 실시간 사기 탐지(지리적 이상점, 거래 빈도, 금액 패턴 등을 복합적으로 분석)와, 시장 데이터 스트림을 분석해 즉각적인 매매 결정을 내리는 알고리즘 트레이딩(이동평균, 변동성, 가격 패턴 등을 실시간 계산)에 쓰인다.

IoT 및 센서 데이터 분석에서는 생산 라인의 센서 데이터를 실시간 분석해 품질 이상 징후를 조기에 감지·알리는 제조 공정 모니터링에 쓰인다.

SELECT machine_id, AVG(temperature) AS avg_temp
FROM MachineDataStream
WINDOW(TIME, 5 MINUTES, SLIDE 30 SECONDS)
GROUP BY machine_id
HAVING avg_temp > 85

에너지 사용량, 재실 상태, 온도 변화 등을 실시간 분석해 최적 환경을 유지하도록 자동 제어하는 스마트 홈/빌딩 관리에도 쓰인다.

텔레콤 및 네트워크 모니터링에서는 트래픽 패턴·패킷 손실·지연 시간을 실시간 분석해 DDoS 공격 등 보안 위협을 조기에 감지하는 네트워크 이상 탐지와, 사용자 경험 데이터를 실시간 수집·분석해 SLA 위반 가능성을 예측하고 선제적으로 대응하는 서비스 품질 모니터링에 쓰인다.

Flink부터 WSO2까지, CQL을 구현하는 플랫폼들

Apache Flink는 스트림 처리와 배치 처리를 통합한 분산 처리 프레임워크로, SQL 인터페이스를 통해 CQL 기능을 제공한다. 상태 관리·장애 복구 기능이 강력해 엔터프라이즈 환경에 적합하다.

Apache Kafka Streams는 Kafka 기반의 경량 스트림 처리 라이브러리로, KSQL을 통해 CQL과 유사한 기능을 구현한다. Kafka 생태계와 완벽히 통합돼 데이터 파이프라인 구축이 쉽다.

Esper는 복잡 이벤트 처리(CEP)에 특화된 엔진으로, EPL(Event Processing Language)이라는 CQL 기반 언어를 제공하며 고성능·저지연 처리에 최적화됐다.

WSO2 Stream Processor는 Siddhi 쿼리 언어 기반의 스트림 처리 솔루션으로, 시각적 쿼리 디자이너와 CQL 인터페이스를 제공하며 엔터프라이즈 통합·분석 기능을 내장한다.

윈도우 크기부터 워터마크까지 설계에서 고민할 것들

성능 최적화에서는 윈도우 크기 설정이 관건이다. 너무 크면 메모리 사용량이 늘고 너무 작으면 분석 가치가 줄어든다. 대용량 스트림 처리를 위한 파티셔닝 전략으로 병렬 처리를 하고, 장기 윈도우 연산을 위한 효율적 상태 관리가 필요하다.

내결함성 설계에서는 최소 한 번(at-least-once) 또는 정확히 한 번(exactly-once) 처리를 보장해 데이터 손실을 막고, 노드 장애 시 처리 상태를 복구하는 메커니즘을 갖추며, 데이터 유입 속도가 처리 속도를 초과할 때 대응하는 백프레셔(Backpressure) 처리가 필요하다.

지연 데이터 처리에서는 이벤트 발생 시간(Event Time)과 처리 시간(Processing Time)을 구분하고, 늦게 도착한 이벤트(Late Events)의 처리 정책을 세우며, 워터마크(Watermark) 메커니즘으로 윈도우 완료 시점을 결정한다.

표현력과 리소스 관리가 남긴 과제

매우 복잡한 패턴이나 머신러닝 모델을 적용하기에는 표현력에 제한이 있고, 시간에 따라 변하는 데이터 스키마를 처리하기 어려우며, 장기간 실행되는 쿼리의 리소스를 효율적으로 관리해야 하고, 실시간 환경에서 쿼리 문제를 진단하는 디버깅·모니터링이 복잡하다.

앞으로는 스트림 데이터에 실시간 머신러닝·딥러닝 모델을 적용하는 인공지능과의 통합, 데이터 소스 근처에서 CQL 처리를 수행해 지연 시간을 줄이는 엣지 컴퓨팅, 비전문가도 쉽게 CQL 쿼리를 만들 수 있는 자연어 인터페이스, 여러 클라우드 환경에 분산된 데이터 스트림을 통합 분석하는 멀티 클라우드 환경 지원 방향으로 발전할 전망이다. 디지털 트랜스포메이션과 데이터 기반 의사결정이 중요해지는 만큼 CQL의 쓰임도 커질 것으로 보인다.

CQL스트림처리윈도우연산실시간쿼리이벤트스트림