카프카는 단순히 메시지를 주고받는 메시지 브로커를 넘어, 데이터의 흐름을 통합하고 실시간으로 처리하는 '이벤트 스트리밍 플랫폼'으로 진화했습니다. 이러한 진화의 중심에는 카프카의 핵심 기능을 확장하는 강력한 도구들, 즉 '카프카 에코시스템'이 있습니다. 그중에서도 가장 중요한 두 가지는 Kafka Connect와 Kafka Streams입니다.
Kafka Connect는 다양한 외부 시스템(데이터베이스, 클라우드 스토리지, 검색 엔진 등)과 카프카를 손쉽게 연결해주는 프레임워크입니다. 개발자가 매번 프로듀서와 컨슈머 코드를 작성하는 반복적인 작업을 없애고, 설정만으로 데이터 파이프라인을 구축할 수 있게 해줍니다.
"MySQL의 사용자 테이블 변경 사항을 카프카로 보내라"는 간단한 요구사항을 위해, 개발자는 아래의 모든 로직을 직접 구현해야 했습니다.
KafkaProducer를 사용하여 토픽으로 전송합니다.이는 순수하게 데이터를 '옮기는' 작업임에도 불구하고, 비즈니스 로직과 무관한 수많은 반복 코드(Boilerplate)를 작성해야 하는 비효율적인 과정이었습니다.
⬇
Kafka Connect를 사용하면, 위에서 언급된 모든 고통스러운 과정을 단 한 줄의 코드도 없이 해결할 수 있습니다. 개발자는 단지 어떤 커넥터(e.g., Debezium MySQL CDC Connector)를 사용할지, DB 주소는 무엇인지, 데이터는 어떤 토픽으로 보낼지 등을 설정 파일(JSON 또는 properties)에 명시하기만 하면 됩니다. 나머지 복잡한 과정은 모두 커넥터가 알아서 처리해 줍니다.
Kafka Streams는 카프카 토픽의 데이터를 실시간으로 처리하고 분석하기 위한 클라이언트 라이브러리입니다. 별도의 스트림 처리 클러스터(e.g., Apache Spark, Flink)를 구축할 필요 없이, 개발자가 만드는 애플리케이션에 내장되어 동작하는 것이 가장 큰 특징입니다.
"5분 단위로 광고 클릭 수를 집계하라"는 요구사항을 위해, 개발자는 일반적인 컨슈머/프로듀서 API를 사용하여 아래의 모든 로직을 직접 구현해야 했습니다.
HashMap을 사용하면 앱 재시작 시 데이터가 유실되므로, 보통 RocksDB와 같은 외부 라이브러리를 연동하거나 파일 시스템에 직접 쓰는 복잡한 로직이 필요합니다.이러한 상태 관리와 장애 처리는 스트림 처리에서 가장 복잡하고 버그가 발생하기 쉬운 부분입니다.
⬇
Kafka Streams는 groupBy(), windowedBy(), count()와 같은 직관적인 고수준 API를 제공하여, 위에서 언급된 모든 복잡한 과정을 추상화합니다. 개발자는 단지 "무엇을 기준으로 묶어서, 얼마 동안의 시간 단위로, 개수를 셀 것인가"만 선언적으로 정의하면 됩니다. 상태 저장, 윈도우 관리, 장애 복구 등 어려운 부분은 모두 Kafka Streams 라이브러리가 내부적으로 처리해 줍니다.
결과적으로, 개발자는 복잡한 내부 구현에 신경 쓸 필요 없이, '데이터가 어떻게 흘러가며 변환될 것인가'라는 비즈니스 로직에만 집중하여 코드를 작성할 수 있습니다.
지금까지의 학습을 통해 우리는 카프카가 단순히 메시지를 전달하는 파이프가 아니라, 데이터를 수집(Connect), 저장(Broker), 처리(Streams)하는 모든 기능을 갖춘 하나의 완성된 '플랫폼'임을 알 수 있습니다. 실무에서는 이러한 에코시스템을 어떻게 조합하여 비즈니스 문제를 해결하는지가 카프카 활용 능력의 척도가 됩니다.
카프카 스터디를 완주하신 것을 축하합니다! 이 지식을 바탕으로 실제 프로젝트에 적용하며 더 깊은 경험을 쌓아나가시길 바랍니다.