[java] 카프카와 자바를 이용한 이벤트 드리븐 아키텍처 구현하기

소개

이벤트 드리븐 아키텍처(Event-driven architecture)는 비동기적인 이벤트 기반의 시스템 구조를 의미합니다. 이 아키텍처는 각각의 컴포넌트가 독립적으로 작동하며, 이벤트를 통해 서로 통신하고 상호작용합니다. 이를 통해 느슨한 결합도와 확장성을 가진 시스템을 구축할 수 있습니다.

카프카(Kafka)는 고성능의 분산 메시징 시스템으로, 대량의 데이터를 신속하게 처리할 수 있도록 지원합니다. 이 블로그 포스트에서는 카프카와 자바를 이용하여 이벤트 드리븐 아키텍처를 구현하는 방법에 대해 알아보겠습니다.

아키텍처 개요

아키텍처는 다음과 같은 구성요소로 이루어집니다.

  1. 이벤트 발행자(Publisher): 이벤트를 생성하고 카프카로 전송합니다.
  2. 이벤트 수신자(Subscriber): 카프카로부터 이벤트를 수신하고 처리합니다.
  3. 카프카: 이벤트를 저장하고, 이벤트 발행자와 수신자 간의 매개체 역할을 합니다.

프로젝트 설정

  1. 카프카 라이브러리 의존성 추가

    <dependency>
        <groupId>org.apache.kafka</groupId>
        <artifactId>kafka-clients</artifactId>
        <version>2.8.0</version>
    </dependency>
    
  2. 카프카 클러스터 연결 설정

    public class KafkaConfig {
        private static final String BOOTSTRAP_SERVERS = "localhost:9092";
    
        public static Properties getConfig() {
            Properties properties = new Properties();
            properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, BOOTSTRAP_SERVERS);
            properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, BOOTSTRAP_SERVERS);
            return properties;
        }
    }
    

이벤트 발행자 구현

public class EventPublisher {
    private static final String TOPIC_NAME = "event_topic";

    public void publishEvent(String event) {
        try (Producer<String, String> producer = new KafkaProducer<>(KafkaConfig.getConfig())) {
            ProducerRecord<String, String> record = new ProducerRecord<>(TOPIC_NAME, event);
            producer.send(record);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

이벤트 수신자 구현

public class EventReceiver {
    private static final String TOPIC_NAME = "event_topic";

    public void start() {
        try (Consumer<String, String> consumer = new KafkaConsumer<>(KafkaConfig.getConfig())) {
            consumer.subscribe(Collections.singletonList(TOPIC_NAME));
            while (true) {
                ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
                for (ConsumerRecord<String, String> record : records) {
                    // 이벤트 처리 로직 구현
                    processEvent(record.value());
                }
            }
        }
    }

    private void processEvent(String event) {
        // 이벤트 처리 로직 구현
        System.out.println("Processing event: " + event);
    }
}

실행

public class Main {
    public static void main(String[] args) {
        EventPublisher publisher = new EventPublisher();
        publisher.publishEvent("Example Event");

        EventReceiver receiver = new EventReceiver();
        receiver.start();
    }
}

마치며

위의 예제를 통해 카프카와 자바를 이용하여 이벤트 드리븐 아키텍처를 구현하는 방법에 대해 살펴보았습니다. 카프카를 사용하면 고성능의 분산 메시징 시스템을 쉽게 구축할 수 있으며, 이를 통해 유연하고 확장 가능한 시스템을 개발할 수 있습니다. 추가적으로 카프카의 다양한 기능들을 알아보고 적절하게 활용하는 것도 중요합니다.

더 많은 내용을 알고 싶다면 카프카 공식 문서를 참고해보세요.