[java] Guice와 Apache Kafka의 통합

Guice는 자바의 의존성 주입(Dependency Injection) 프레임워크로, 애플리케이션의 코드를 더 모듈화하고 테스트하기 쉽게 만들어줍니다. Apache Kafka는 대규모 분산 스트리밍 플랫폼으로, 실시간 데이터 흐름을 처리하는 데 사용됩니다.

이 글에서는 Guice와 Apache Kafka를 함께 사용하는 방법에 대해 알아보겠습니다.

Guice 모듈 설정

먼저, Guice에서 Kafka를 사용하기 위해 Kafka 관련 모듈을 설정해야 합니다. 아래는 Guice 모듈 설정의 예입니다.

import com.google.inject.AbstractModule;
import com.google.inject.name.Names;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.common.serialization.StringSerializer;
import org.apache.kafka.common.serialization.StringDeserializer;

public class KafkaModule extends AbstractModule {

    @Override
    protected void configure() {
        // Kafka Producer 설정
        bind(KafkaProducer.class)
                .annotatedWith(Names.named("producer"))
                .toProvider(KafkaProducerProvider.class);
        
        // Kafka Consumer 설정
        bind(KafkaConsumer.class)
                .annotatedWith(Names.named("consumer"))
                .toProvider(KafkaConsumerProvider.class);
    }
}

위의 예제에서는 KafkaProducerKafkaConsumer를 Guice에 등록하기 위해 bind() 메서드를 사용합니다. @Named 어노테이션을 사용하여 각각의 인스턴스에 이름을 지정합니다.

Kafka Producer Provider

다음으로는 KafkaProducer 인스턴스를 제공하는 KafkaProducerProvider를 구현해야 합니다. 아래는 간단한 예제입니다.

import com.google.inject.Provider;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.KafkaProducer;

import java.util.Properties;

public class KafkaProducerProvider implements Provider<KafkaProducer<String, String>> {

    @Override
    public KafkaProducer<String, String> get() {
        Properties properties = new Properties();
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);

        return new KafkaProducer<>(properties);
    }
}

위의 예제에서는 KafkaProducer를 생성할 때 필요한 설정을 Properties 객체에 지정한 후, 해당 객체를 사용하여 KafkaProducer 인스턴스를 생성합니다.

Kafka Consumer Provider

마지막으로, KafkaConsumer 인스턴스를 제공하는 KafkaConsumerProvider를 구현해야 합니다. 아래는 간단한 예제입니다.

import com.google.inject.Provider;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.consumer.KafkaConsumer;

import java.util.Properties;

public class KafkaConsumerProvider implements Provider<KafkaConsumer<String, String>> {

    @Override
    public KafkaConsumer<String, String> get() {
        Properties properties = new Properties();
        properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        properties.put(ConsumerConfig.GROUP_ID_CONFIG, "my-group");
        properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);

        return new KafkaConsumer<>(properties);
    }
}

위의 예제에서는 KafkaConsumer를 생성할 때 필요한 설정을 Properties 객체에 지정한 후, 해당 객체를 사용하여 KafkaConsumer 인스턴스를 생성합니다.

Guice 모듈 등록

마지막으로, Guice 모듈을 애플리케이션에 등록해야 합니다. 아래는 Guice를 사용하는 예제 애플리케이션의 Main 클래스입니다.

import com.google.inject.Guice;
import com.google.inject.Injector;

public class Main {

    public static void main(String[] args) {
        Injector injector = Guice.createInjector(new KafkaModule());
        MyApplication application = injector.getInstance(MyApplication.class);
        
        application.run();
    }
}

위의 예제에서는 KafkaModule을 Guice의 createInjector() 메서드에 전달하여 Guice 모듈을 등록합니다. 그 후, getInstance() 메서드를 사용하여 MyApplication 클래스의 인스턴스를 얻고, 해당 인스턴스의 run() 메서드를 호출합니다.

결론

이 글에서는 Guice와 Apache Kafka를 함께 사용하는 방법에 대해 알아보았습니다. Guice를 사용하면 애플리케이션의 코드를 모듈화하고 테스트하기 쉽게 만들 수 있으며, Apache Kafka를 사용하면 대규모 분산 스트리밍 데이터를 처리할 수 있습니다.

더 자세한 내용은 Guice와 Apache Kafka의 공식 문서를 참조하시기 바랍니다.