본문 바로가기
스프링 부트3

스프링 부트 3와 Kafka 연동

by 굿센스굿 2024. 12. 5.
반응형

 

스프링 부트 3와 Kafka의 연동은 대규모 데이터 처리와 실시간 스트리밍에 있어 필수적인 기술 조합입니다. Kafka는 분산 메시징 시스템으로 대용량 데이터를 처리하는 데 최적화되어 있으며, 스프링 부트 3는 이를 손쉽게 통합할 수 있도록 다양한 기능과 설정을 제공합니다. 이번 블로그 글에서는 스프링 부트 3와 Kafka를 연동하는 방법과 실제 활용 사례 3가지를 소개하겠습니다.


1. Kafka란 무엇인가?

Kafka는 LinkedIn에서 개발된 오픈 소스 분산 메시징 플랫폼으로, 빠르고 확장 가능한 데이터 파이프라인을 제공합니다. 주로 실시간 데이터 스트리밍, 로그 수집, 이벤트 소싱 등에 사용되며, 높은 내구성과 확장성이 특징입니다.

Kafka의 주요 구성 요소는 다음과 같습니다:

  • Producer: 메시지를 생성하여 Kafka로 보내는 역할을 합니다.
  • Broker: 메시지를 저장하고 관리하며, Kafka 서버를 의미합니다.
  • Consumer: 메시지를 읽고 처리하는 역할을 합니다.
  • Topic: 메시지가 게시되는 카테고리 또는 스트림을 나타냅니다.
  • Partition: Topic을 더 작은 단위로 나누어 데이터 병렬 처리가 가능하도록 합니다.

2. 스프링 부트 3와 Kafka의 연동 방법

(1) Maven 의존성 추가

스프링 부트 3와 Kafka를 연동하기 위해 필요한 의존성을 pom.xml 파일에 추가합니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
</dependency>

(2) Kafka 설정 파일 작성

application.yml 파일에서 Kafka 브로커와 관련된 설정을 추가합니다.

spring:
  kafka:
    bootstrap-servers: localhost:9092
    consumer:
      group-id: my-group
      auto-offset-reset: earliest
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer

(3) Kafka Producer 및 Consumer 작성

Kafka 메시지를 송신하고 수신하는 Producer와 Consumer를 생성합니다.

Producer

import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;

@Service
public class KafkaProducer {
    private final KafkaTemplate<String, String> kafkaTemplate;

    public KafkaProducer(KafkaTemplate<String, String> kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    public void sendMessage(String topic, String message) {
        kafkaTemplate.send(topic, message);
        System.out.println("Message sent to topic: " + topic);
    }
}

Consumer

import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Service;

@Service
public class KafkaConsumer {

    @KafkaListener(topics = "my-topic", groupId = "my-group")
    public void listen(String message) {
        System.out.println("Received message: " + message);
    }
}

3. 스프링 부트 3와 Kafka 연동 실습 예시

(1) 예제 1: 실시간 주문 처리 시스템

시나리오: 전자 상거래 애플리케이션에서 고객 주문 데이터를 실시간으로 처리합니다.

  1. 주문이 생성될 때 Producer가 Kafka Topic(order-topic)에 주문 데이터를 전송합니다.
  2. Consumer는 order-topic에서 메시지를 읽어 주문 상태를 업데이트하거나, 백엔드 시스템에 저장합니다.

주문 생성 코드 (Producer)

public void createOrder(Order order) {
    kafkaProducer.sendMessage("order-topic", order.toString());
}

(2) 예제 2: 실시간 로그 수집 및 모니터링

시나리오: 애플리케이션 로그를 Kafka로 전송하여 중앙 로그 관리 시스템에서 분석합니다.

  1. 각 애플리케이션 서비스는 로그 데이터를 log-topic으로 전송합니다.
  2. 분석 시스템에서 로그를 수신하고 실시간 대시보드에 시각화합니다.

로그 전송 코드 (Producer)

logger.info("Error occurred in service A");
kafkaProducer.sendMessage("log-topic", "Error in Service A");

(3) 예제 3: IoT 데이터 스트리밍

시나리오: IoT 기기에서 생성된 센서 데이터를 Kafka로 전송하고 실시간 분석합니다.

  1. 각 IoT 기기는 센서 데이터를 Producer로 Kafka에 보냅니다.
  2. Consumer는 sensor-data Topic을 구독하여 데이터를 처리하고, 알림을 생성하거나 데이터를 저장합니다.

센서 데이터 전송 코드 (Producer)

kafkaProducer.sendMessage("sensor-data", sensorData.toJson());

4. 결론

스프링 부트 3와 Kafka의 연동은 다양한 데이터 처리 시나리오에서 강력한 솔루션을 제공합니다. 위에서 설명한 실습 예제들을 활용하여, 실시간 데이터 스트리밍 애플리케이션을 효율적으로 개발할 수 있습니다. Kafka의 확장성과 스프링 부트 3의 생산성을 결합하면, 복잡한 데이터 처리 작업도 손쉽게 구현 가능합니다.

Tip: 실시간 데이터 처리가 핵심인 프로젝트에서 Kafka의 파티션 및 컨슈머 그룹 설정을 통해 확장성을 최대화하세요.

반응형