본문 바로가기
🔥 Data Engineer/Kafka

[Kafka] - 카프카 KSQL(KsqlDB)란? 스트리밍 SQL로 실시간 데이터 처리하기

by jyu_seo_ 2026. 1. 22.

KsqlDB란?

ksqlDB(이전 명칭: KSQL, Kafka SQL)는 Apache Kafka를 위한 스트리밍 SQL 엔진이다. SQL 인터페이스를 제공하여 개발자들이 익숙한 SQL 구문으로 Kafka에서 실시간 스트리밍 처리를 쉽게 할수 있도록 도와준다.

 

2017년 Confluent 사에서 개발을 시작했으며, 2019년에 KSQL에서 ksqlDB로 재브랜딩되었습니다. Confluent Community License 하에 제공되고 있습니다.

 

 

주요 기능

1. 친숙한 SQL 구문

관계형 데이터베이스와 유사한 방식으로 실시간 스트리밍 데이터를 처리할 수 있다. 복잡한 스트림 처리 로직을 간단한 SQL로 표현할 수 있어 학습 곡선이 낮다.

2. 확장 가능한 아키텍처

ksqlDB는 fault-tolerant하고 수평 확장이 가능하도록 설계되어 있어, 대용량 데이터 처리에도 안정적으로 동작한다.

 

3. 다양한 스트리밍 연산 지원

  • 데이터 필터링 및 변환
  • 집계 (Aggregation)
  • 조인(Join)
  • 윈도우 연산(Window Operations)
  • 세션화(Sessionization)

4. 풍부한 내장함수

SUM , COUNT, UCASE, REPLACE, TRIM 등 다양한 함수를 제공하며, 사용자 정의함수 (UDF) 및 람다 함수도 지원한다.

5. Kafka Connect 통합

ksqlDB 내에서 Kafka Connect를 직접 관리할 수 있어, 데이터 소스 및 싱크 연결이 간편하다.

 

KsqlDB 아키텍처

 

ksqlDB의 아키텍처는 크게 세 가지 주요 구성 요소로 이루어져 있다.

1. ksqlDB Client

  • ksqlDB CLI: MySQL이나 PostgreSQL과 같은 커맨드 라인 인터페이스 제공
  • ksqlDB UI: Control Center(유료 버전)를 통해 GUI 환경에서 관리 가능

2. REST Interface

클라이언트가 ksqlDB 엔진에 접근할 수 있도록 중개 역할을 수행한다.

3. ksqlDB Engine

  • KSQL 구문과 쿼리를 파싱하고 실행
  • 각 ksqlDB 서버는 엔진 인스턴스를 실행
  • RocksDB를 내부 상태 저장소로 사용하여 Materialized View를 로컬 디스크에 저장

RocksDB는 Facebook에서 개발한 오픈소스 embedded key-value 저장소로, 대용량 데이터 처리에 최적화되어 있습니다.

 

왜 ksql DB를 사용해야 할까?

 

ksqlDB VS kafka Streams

특징 ksqlDB Kafka Streams
구문 SQL 기반 Java/Scala 코드
학습 곡선 낮음 (SQL 지식만 필요) 높음 (라이브러리 이해 필요)
개발 속도 빠름 (즉시 테스트 가능) 상대적으로 느림
복잡도 간단한~중간 수준 처리에 적합 복잡한 스트리밍 처리에 유리
인터랙티브 CLI로 즉시 확인 가능 컴파일 및 배포 필요

 

ksqlDB는 Kafka Streams 라이브러리 기반으로 개발되었으므로, 내부적으로는 Kafka Streams의 강력한 기능을 활용하면서도 SQL이라는 친숙한 인터페이스를 제공한다.

핵심 개념: Stream과 Table

Stream (스트림)

  • 영속적으로 무제한의 스트리밍 이벤트 컬렉션
  • 각 Row는 불변(immutable)이며 append-only
  • INSERT만 가능
  • 파티션으로 데이터 관리
-- Kafka topic에서 Stream 생성
CREATE STREAM riderLocations (
	profileId VARCHAR,
    latitude DOUBLE,
    longitude DOUBLE

)
WITH (
	kafka_topic = 'locations',
    value_format= 'json',
    partitions=1
)

 

Table (테이블 / Materialized View)

  • 현재 최신 상태를 나타내는 mutable 컬렉션
  • Primary Key 필수
  • INSERT, UPDATE, DELETE 가능
  • 실시간으로 업데이트 되는 뷰
-- 라이더의 최신 위치를 추적하는 테이블 생성
CREATE TABLE currentLocation AS
SELECT profileId,
	   LATEST_BY_OFFSET(latitude) AS la,
       LATEST_BY_OFFSET(longitude) AS lo
FROM riderlocations
GROUP BY profileID
EMIT CHANGES;

 

쿼리 유형

1. Push Query (Continuous Query)

- 실시간으로 변경되는 결과를 지속적으로 구독한다.

-- Stream 데이터를 실시간으로 조회
SELECT * FROM riderLocations
WHERE GEO_DISTANCE(latitude, longitude, 37.4133, -122.1162) <= 5
EMIT CHANGES;

2. Pull Query (Classic Query)

테이블의 현재 상태를 한 번만 조회한다.

-- 현재 Mountain View에서 10마일 이내의 라이더 조회
SELECT * FROM ridersNearMountainView
WHERE distanceInMiles <= 10;

 

윈도우 연산(Window Operations)

ksqlDB는 시간 기반 윈도우 연산을 지원한다.

1. Tumbling Window

  • 고정 기간, 겹치지 않음
  • 예: 매 1시간마다 집계
WINDOW TUMBLING (SIZE 1 HOUR)

 

2. Hopping Window

  • 고정 기간, 겹침 허용
  • 예: 30초 윈도우를 10초마다 생성
WINDOW HOPPING (SIZE 30 SECONDS, ADVANCE BY 10 SECONDS)

 

3. Session Window

  • 동적 크기, 활동 기반
  • 사용자 행동 분석에 유용
WINDOW SESSION (60 SECONDS)

실제 예제

-- 30초 텀플링 윈도우로 지역별 페이지 뷰 수 집계
CREATE TABLE pageviews_per_region AS
SELECT userid, gender, regionid, COUNT(*) AS numusers
FROM pageviews_stream
WINDOW TUMBLING (SIZE 30 SECOND)
GROUP BY userid, gender, regionid
HAVING COUNT(*) > 1
EMIT CHANGES;

 

 

데이터 조인 (Joins)

 

 

실시간 스트림과 테이블을 조인하여 풍부한 데이터를 생성할 수 있다.

-- pageviews 스트림과 users 테이블 조인
CREATE STREAM user_pageviews AS
SELECT users_table.id AS userid, pageid, regionid, gender
FROM pageviews_stream
LEFT JOIN users_table 
ON pageviews_stream.userid = users_table.id
EMIT CHANGES;

 

실제 사용 사례

ksqlDB는 다양한 산업 분야에서 활용되고 있다.

 

주요 사용 기업

  • Naver LINE : AB Test Report 시스템 개선
  • 토스증권: 실시간 뉴스 추천 시스템
  • Ticketmaster: 실시간 티켓 판매 분석
  • Bosch: loT 데이터 처리

활용 분야

  • 실시간 분석 및 모니터링
  • 이상 징후 감지
  • 실시간 알림 시스템
  • 물류 및 loT 관리
  • 사이버 보안
  • Customer 360
  • 예측 분석

시작하기

Docker Compose로 빠른 설치

# docker-compose.yml 다운로드
curl --output docker-compose.yml \
  https://raw.githubusercontent.com/confluentinc/cp-all-in-one/latest/cp-all-in-one/docker-compose.yml

# Confluent Platform 시작
docker-compose up -d

# ksqlDB CLI 접속
docker exec -it ksqldb-cli ksql http://ksqldb-server:8088

REST API 지원

curl --location --request POST 'http://localhost:8088/ksql' \
--header 'Content-Type: application/json' \
--data-raw '{
  "ksql": "SHOW STREAMS;",
  "streamProperties":{}
}'

 

마무리

ksqlDB는 익숙한 SQL 구문으로 Kafka의 강력한 스트리밍 처리 능력을 쉽게 활용할 수 있게 해주는 혁신적인 도구다.

복잡한 코드 작성 없이 실시간 데이터 파이프라인을 구축하고 싶다면, ksqlDB는 최고의 선택이 될 것이다.

특히 SQL에 익숙한 데이터 엔지니어나 분석가라면, 학습 곡선 없이 바로 실시간 스트리밍 처리를 시작할 수 있다는 점이 큰 장점이다.