카프카 KSQL(ksqlDB)이란? 스트리밍 SQL로 실시간 데이터 처리하기

GarionNachal·2026년 1월 4일

kafka

목록 보기
10/23
post-thumbnail

📌 ksqlDB란?

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

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

ksqlDB Logo

🚀 주요 기능

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 Architecture Diagram

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 저장소로, 대용량 데이터 처리에 최적화되어 있습니다.

💡 왜 ksqlDB를 사용해야 할까?

Kafka Stream Processing Methods

ksqlDB vs Kafka Streams

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

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

📊 핵심 개념: Stream과 Table

Stream vs 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)

Window Types

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)

Joins Example

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

-- 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: IoT 데이터 처리

활용 분야

  • ✅ 실시간 분석 및 모니터링
  • ✅ 이상 징후 감지
  • ✅ 실시간 알림 시스템
  • ✅ 물류 및 IoT 관리
  • ✅ 사이버 보안
  • ✅ 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는 Apache License 2.0이 아닌 Confluent Community License로 제공됩니다.

  • ✅ 회사 내부 프로젝트에 사용 가능
  • ❌ ksqlDB 자체를 SaaS 제품으로 제공하는 것은 제한
  • 💡 상용 사용 전 라이선스 검토 권장

🎯 마무리

ksqlDB는 익숙한 SQL 구문으로 Kafka의 강력한 스트리밍 처리 능력을 쉽게 활용할 수 있게 해주는 혁신적인 도구입니다. 복잡한 코드 작성 없이 실시간 데이터 파이프라인을 구축하고 싶다면, ksqlDB는 최고의 선택이 될 것입니다.

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


📚 참고 자료


이 글이 도움이 되셨나요? 카프카와 ksqlDB를 활용한 실시간 데이터 처리에 대해 더 궁금한 점이 있다면 댓글로 남겨주세요! 🚀

profile
AI를 꿈꾸는 BackEnd개발자

0개의 댓글