[java] Kafka Streams와 스트림 처리를 위한 컨테이너화된 환경 개발 방법

Kafka Streams는 Apache Kafka를 기반으로 한 분산 스트림 처리 라이브러리로, 실시간으로 데이터를 처리하고 변환하는 데 사용됩니다. 이를 활용하여 스트림 처리를 위한 애플리케이션을 개발하려면 컨테이너 환경에서의 개발 방법을 알아야 합니다.

1. 컨테이너 기술 선택

컨테이너 기술은 애플리케이션의 배포, 관리, 확장 등에 매우 중요합니다. Kafka Streams 애플리케이션을 개발하기 위해 컨테이너 기술로 Docker를 선택할 수 있습니다. Docker는 가상화된 컨테이너 환경을 제공하여 애플리케이션을 독립적으로 실행하고 관리할 수 있습니다.

2. Docker 이미지 작성

Kafka Streams 애플리케이션을 실행하기 위해서는 Kafka와 필요한 dependency를 포함한 Docker 이미지를 작성해야 합니다. 이미지 작성을 위해 Dockerfile을 작성하고 필요한 패키지와 설정을 추가해야 합니다. 예를 들어, 실행에 필요한 Java JDK, Kafka Streams 라이브러리 등을 설치할 수 있습니다.

FROM openjdk:8-jdk-alpine

WORKDIR /app

COPY target/my-kafka-streams-app.jar /app/

# 다른 설정들...

3. Docker 컴포즈 파일 작성

여러 개의 컨테이너를 함께 실행하고 관리하기 위해 Docker Compose를 사용할 수 있습니다. Kafka Streams 애플리케이션을 실행하기 위해 필요한 ZooKeeper와 Kafka 브로커를 함께 실행하기 위한 Docker Compose 파일을 작성해야 합니다.

version: '3'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka:
    image: wurstmeister/kafka
    ports:
      - "9092:9092"
    environment:
      - KAFKA_ADVERTISED_HOST_NAME=kafka
      - KAFKA_CREATE_TOPICS=my-topic:1:1
    links:
      - zookeeper
  my-kafka-streams-app:
    build:
      context: .
      dockerfile: Dockerfile
    depends_on:
      - kafka

4. 애플리케이션 코드 작성

Kafka Streams 애플리케이션의 핵심은 처리 로직을 포함하는 코드입니다. Java 언어로 개발할 경우 Kafka Streams 라이브러리를 이용하여 토픽으로부터 데이터를 읽고 필요한 변환을 적용하고, 다시 다른 토픽으로 데이터를 출력할 수 있습니다.

import org.apache.kafka.streams.KafkaStreams;
import org.apache.kafka.streams.StreamsBuilder;
import org.apache.kafka.streams.StreamsConfig;
import org.apache.kafka.streams.kstream.KStream;
import java.util.Properties;

public class MyKafkaStreamsApp {
    public static void main(String[] args) {
        Properties props = new Properties();
        props.put(StreamsConfig.APPLICATION_ID_CONFIG, "my-kafka-streams-app");
        props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");

        StreamsBuilder builder = new StreamsBuilder();
        KStream<String, String> source = builder.stream("my-input-topic");
        // 데이터 처리 로직 작성
        source.filter((key, value) -> value.contains("important"))
              .to("my-output-topic");

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

5. 애플리케이션 빌드 및 실행

애플리케이션 코드를 작성했다면 빌드하여 JAR 파일을 생성해야 합니다. 빌드 도구로 Maven, Gradle 등을 사용할 수 있습니다. 다음으로, Docker Compose를 사용하여 애플리케이션과 필요한 컨테이너들을 실행할 수 있습니다.

$ docker-compose up

결론

Kafka Streams를 활용하여 스트림 처리 애플리케이션을 개발하기 위해서는 컨테이너 기술과 Docker를 이용한 환경 구축이 필요합니다. Docker를 활용하여 Kafka 및 애플리케이션을 배포하고 실행하는 방법에 대해 알아보았습니다. 이를 통해 스트림 처리 애플리케이션을 효율적으로 개발할 수 있습니다.

[참고자료]