백엔드 데이터 인프라 90편 — Kafka API 5종 종합 (Producer · Consumer · Streams · Connect · Admin)

2026-05-17백엔드 데이터 인프라

백엔드 데이터 인프라 90편. Kafka 5가지 핵심 API 종합 — Producer·Consumer·Streams·Connect·Admin 의 자리와 사용 시점, kafka-clients·kafka-streams 의존성, Java 클라이언트 시작·언어별 client 까지 풀어쓴 학습 노트.

📚 백엔드 데이터 인프라 · 90편 — Kafka API 5종 종합 (Producer · Consumer · Streams · Connect · Admin)

이 글은 백엔드 데이터 인프라 시리즈 130편 중 90편이에요. Part 5-2 Design 7편 으로 Kafka 의 내부 설계 를 잡았다면, 이번 90편부터는 Part 5-3 — Kafka API (4편). 첫 글은 5가지 API 의 자리 를 한눈에 — 다음 91~93편의 Producer / Consumer / Admin 깊이 전 큰 그림.

Kafka API가 어렵게 느껴지는 이유

API 가 다섯이고 각각의 역할도, 의존성도 다르다. 거기에 Connectclient 처럼 이름까지 비슷한 게 섞여 있어 처음 보면 헷갈리기 쉬워요.

첫째, 5가지 API 의 정확한 분담. 언제 어느 걸 쓸지가 명확해야 의존성·아키텍처 설계 가능.

둘째, kafka-clients vs kafka-streams 의존성. 같은 clients 아래 묶여 있지만 별도 의존성. Connect 도 별도.

이 글에서는 5가지 API 의 자리·의존성과, 다음 글들에서 깊이 풀어낼 영역까지 한 번에 잡아둡니다.

Kafka 5가지 핵심 API

# API 역할 의존성
1 Producer Kafka 에 데이터 send kafka-clients
2 Consumer Kafka 에서 데이터 read kafka-clients
3 Streams Topic → 변환 → Topic transform kafka-streams
4 Connect 외부 시스템 ↔ Kafka integration kafka-connect-api
5 Admin topic·broker·ACL 관리 kafka-clients

핵심 — Producer / Consumer / Admin 은 같은 kafka-clients (Kafka 공식 Java 클라이언트 라이브러리) 의존성. StreamsConnect 는 별도.

API 별 자리 — 결정 가이드

나는 무엇을 하려나?
├─ 애플리케이션에서 Kafka 에 메시지 보냄
│   └─ Producer API
├─ 애플리케이션에서 Kafka 메시지 받음
│   └─ Consumer API
├─ Kafka 안에서 stream 처리 (topic A → 변환 → topic B)
│   └─ Streams API
├─ 외부 시스템 (DB·S3·Elasticsearch) ↔ Kafka 연결
│   └─ Connect API (보통 pre-built connector 사용)
└─ Topic 생성·삭제·ACL 관리 (운영 자동화)
    └─ Admin API

대부분의 백엔드 = Producer + Consumer 만. Streams·Connect·Admin 은 특수 자리.

1. Producer API

의존성

<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka-clients</artifactId>
    <version>4.0.2</version>
</dependency>

가장 단순한 사용

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

try (KafkaProducer<String, String> producer = new KafkaProducer<>(props)) {
    producer.send(new ProducerRecord<>("orders", "user42", "buy item"));
}

깊이 = 91편 Producer API.

2. Consumer API

의존성

같은 kafka-clients.

가장 단순한 사용

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "order-workers");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

try (KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props)) {
    consumer.subscribe(Arrays.asList("orders"));
    while (true) {
        ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(1000));
        for (ConsumerRecord<String, String> record : records) {
            System.out.println(record.key() + " -> " + record.value());
        }
    }
}

깊이 = 92편 Consumer API.

3. Streams API

의존성

<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka-streams</artifactId>
    <version>4.0.2</version>
</dependency>

kafka-streamskafka-clients별도 의존성이에요. 내부적으로는 producer + consumer 를 활용하지만, 그 위에 stream 처리 전용 추상화 를 한 겹 더 얹은 API.

가장 단순한 사용

StreamsBuilder builder = new StreamsBuilder();
KStream<String, String> input = builder.stream("input-topic");

input.mapValues(value -> value.toUpperCase())
     .to("output-topic");

KafkaStreams streams = new KafkaStreams(builder.build(), props);
streams.start();

StreamsBuilder 는 stream topology 를 선언적으로 짓는 빌더, KStream 은 토픽을 흐르는 레코드 스트림 추상이에요. 위 코드는 input-topic 의 모든 메시지를 uppercase 로 변환해 output-topic 으로 흘려보냅니다. 상태 저장·windowing (시간 구간 단위 집계)·조인 같은 풍부한 패턴까지 지원.

깊이 = 121~129편 Part 5-10 Streams (9편).

4. Connect API

두 가지 사용 모드

(A) Pre-built Connector 사용 (대부분)

# Docker 로 Kafka Connect 실행
$ docker run -d --name connect \
    -e CONNECT_BOOTSTRAP_SERVERS=localhost:9092 \
    confluentinc/cp-kafka-connect:latest

# REST API 로 connector 등록
$ curl -X POST -H "Content-Type: application/json" \
    --data '{
      "name": "jdbc-source",
      "config": {
        "connector.class": "io.confluent.connect.jdbc.JdbcSourceConnector",
        "connection.url": "jdbc:postgresql://...",
        "topic.prefix": "pg-"
      }
    }' \
    http://localhost:8083/connectors

코드 없이 설정만으로 PostgreSQL → Kafka 데이터 동기화. 가장 일반적.

(B) Custom Connector 작성

<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>connect-api</artifactId>
    <version>4.0.2</version>
</dependency>

connect-api 는 직접 connector 를 짤 때 쓰는 의존성이에요.

public class MyConnector extends SourceConnector {
    // SourceConnector 또는 SinkConnector 구현
}

특수한 외부 시스템 연결 시. 깊이 = 117~120편 Part 5-9 Connect (4편).

5. Admin API

의존성

같은 kafka-clients.

가장 단순한 사용

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");

try (AdminClient admin = AdminClient.create(props)) {
    // Topic 생성
    NewTopic topic = new NewTopic("new-topic", 3, (short) 2);
    admin.createTopics(Collections.singletonList(topic)).all().get();

    // Topic 목록
    Set<String> topics = admin.listTopics().names().get();
    System.out.println(topics);

    // Topic 정보
    DescribeTopicsResult result = admin.describeTopics(Collections.singletonList("new-topic"));
    TopicDescription desc = result.allTopicNames().get().get("new-topic");
    System.out.println(desc.partitions().size());

    // Topic 삭제
    admin.deleteTopics(Collections.singletonList("new-topic"));
}

AdminClient 는 토픽·ACL (Access Control List, 접근 권한 목록)·broker 설정을 코드에서 제어하는 진입점이에요. 93편 Admin API 에서 깊이 — 운영 자동화 (provisioning (자원 사전 준비)·monitoring·security) 패턴까지.

언어별 클라이언트

여기서 시험 함정이 하나 있어요 — Kafka 공식 maintain 은 Java 클라이언트만. 다른 언어 클라이언트는 오픈소스 커뮤니티 maintain.

언어 인기 클라이언트
Java (공식) kafka-clients (Apache 공식)
Python confluent-kafka-python·kafka-python
Node.js kafkajs·node-rdkafka
Go confluent-kafka-go·segmentio/kafka-go
C/C++ librdkafka (Confluent)
C#/.NET Confluent.Kafka
Rust rdkafka-rust
PHP php-rdkafka

대부분의 클라이언트가 librdkafka (C 로 짠 Kafka 클라이언트 코어 라이브러리) 기반. Java 외 모든 언어가 librdkafka wrapper.

Confluent 클라이언트 vs 다른 오픈소스

  • Confluent (Kafka 상용 배포사) 시리즈 = librdkafka 기반, 공식적 신뢰, schema registry (스키마 중앙 관리 서비스) 통합
  • kafka-python·kafkajs 등 = pure-language 구현, 작은 환경 친화

새 프로젝트는 Confluent 시리즈 권장 (호환성 + 성능).

같은 의존성·다른 사용 패턴

핵심 — Producer / Consumer / Admin 이 같은 kafka-clients 의존성:

<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka-clients</artifactId>
    <version>4.0.2</version>
</dependency>

한 의존성으로 3가지 API 모두 가능. Streams 와 Connect 만 별도 의존성.

Spring Boot 환경 — spring-kafka

Spring 환경에서는 raw kafka-clients API 직접 사용 X. spring-kafka 추상화:

<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
</dependency>
// Producer
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;

// Consumer
@KafkaListener(topics = "orders", groupId = "workers")
public void listen(String message) { ... }

// Streams
@Bean
public KStream<String, String> kStream(StreamsBuilder builder) { ... }

// Admin
@Bean
public NewTopic ordersTopic() {
    return TopicBuilder.name("orders").partitions(3).replicas(2).build();
}

KafkaTemplate 은 Producer 를 감싼 Spring 헬퍼, @KafkaListener 는 Consumer 를 메서드 단위로 선언하는 어노테이션이에요. 훨씬 깔끔. 130편 Spring Kafka 에서 깊이.

API 별 자주 쓰이는 자리

API 자주 쓰는 자리
Producer 모든 백엔드 서비스 (메시지 send)
Consumer 메시지 받아 처리하는 워커
Streams 실시간 ETL·집계·조인 파이프라인
Connect DB CDC·S3 sink·Elasticsearch sink 등
Admin DevOps 자동화·운영 스크립트·CI/CD topic provisioning

여기서 CDC 는 Change Data Capture — DB 변경분을 스트림으로 흘려보내는 패턴이에요.

한계·실무 함정

1. Streams 와 일반 Consumer 혼동

Streams 는 Consumer + Producer 위에 빌드된 추상화. Streams 안에서 Consumer API 직접 호출 X. 둘 중 하나 선택.

2. Connect 가 별도 인프라

Connect 는 자체 worker 프로세스. 애플리케이션과 분리 운영. 모니터링·scaling 별도.

3. Admin API 권한

ACL 환경에서 admin 작업 = 별도 권한 필요 (Cluster:Describe·Topic:Create 등). 운영 환경에서 제한된 admin 사용자.

4. 버전 호환성

Kafka client 4.0 은 broker 2.5+ 와 호환 (보통 forward compatible — 구버전 broker 가 신버전 client 를 받아주는 호환). 그러나 최신 기능 사용은 client 와 broker 모두 최신.

5. Java 외 클라이언트의 성숙도 차이

언어마다 feature gap (지원 기능 격차) 존재. 최신 Kafka feature 사용 전 해당 언어 client 지원 확인.

시험 직전 한 번 더 — Kafka API 함정 압축 노트

  • 5가지 API = Producer · Consumer · Streams · Connect · Admin
  • 같은 의존성 kafka-clients = Producer + Consumer + Admin
  • 별도 의존성 — Streams (kafka-streams)·Connect (connect-api)
  • Producer = 메시지 send, KafkaProducer<K,V> + send()
  • Consumer = 메시지 read, KafkaConsumer<K,V> + subscribe + poll
  • Streams = topic → 변환 → topic, StreamsBuilder + KStream
  • Connect = 외부 시스템 통합, 대부분 pre-built connector + REST API
  • Admin = topic·broker·ACL 관리, AdminClient.create()
  • 공식 maintain = Java 클라이언트만
  • 다른 언어 = 오픈소스 커뮤니티, 대부분 librdkafka 기반
  • 인기 = Confluent 시리즈 (Python·Node·Go·C#·...)
  • pure-language = kafka-python·kafkajs
  • Spring Boot = spring-kafka 추상화
  • KafkaTemplate·@KafkaListener·StreamsBuilder + @Bean NewTopic
  • Producer / Consumer 가 대부분 백엔드의 90%
  • Streams·Connect·Admin = 특수 자리
  • Streams = Consumer + Producer 위 추상화, 둘 중 선택
  • Connect = 자체 worker 프로세스, 분리 운영
  • Admin = DevOps 자동화·CI/CD provisioning
  • Admin 권한 = ACL 환경에서 별도 제한
  • 함정 — Streams 와 Consumer 혼동
  • 함정 — Connect 별도 인프라 모니터링·scaling
  • 함정 — Java 외 client feature gap
  • 함정 — 최신 기능은 client + broker 모두 최신 필요

공식 문서: Kafka APIs 에서 모든 API 의 javadoc 과 사양을 확인할 수 있어요.

시리즈 다른 편 (앞뒤 글 모음)

이전 글:

다음 글:

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

답글 남기기

error: Content is protected !!