Spring Boot + Kafka 연동 (with Docker)

이정빈·2025년 6월 14일
0

SMART-ETA 프로젝트

목록 보기
1/1
post-thumbnail

배달 관련 프로젝트를 진행하며 도커와 카프카 도입이 필요했다.

1. Kafka를 도입한 이유

  • 배달 ETA는 주문 상태 변화에 따라 유동적으로 조정된다.
  • Kafka는 이런 이벤트 기반 아키텍처에서 핵심 역할을 하는 메시지 브로커이기 때문

2. Kafka 환경 구성 (Docker Compose)

version: '3.8'

services:
  zookeeper:
    image: bitnami/zookeeper:latest
    container_name: zookeeper
    ports:
      - "2181:2181"  # Zookeeper는 Kafka를 위한 메타데이터 저장소 역할
    environment:
      - ALLOW_ANONYMOUS_LOGIN=yes

  kafka:
    image: bitnami/kafka:3.5.1
    container_name: kafka
    ports:
      - "9092:9092"  # Kafka 브로커가 외부로 노출되는 포트
    environment:
      - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181  # Zookeeper 연결 설정
      - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092  # 내부용 Listener
      - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092  # 외부용 Listener
      - ALLOW_PLAINTEXT_LISTENER=yes  # 인증 없이 허용 (개발용)
      - KAFKA_ENABLE_KRAFT=no  # KRaft 모드 비활성화 → Zookeeper 기반 Kafka 사용
    depends_on:
      - zookeeper  # Kafka는 Zookeeper가 먼저 실행되어야 함

실행하기 (실행 명령어)

docker compose up -d

도커에서 잘 실행되고 있다!


3. Spring Boot 설정

Gradle 의존성 추가

implementation 'org.springframework.kafka:spring-kafka'

application.yml 설정

spring:
  kafka:
    bootstrap-servers: localhost:9092
    consumer:
      group-id: smarteta-group
      auto-offset-reset: earliest

4. Kafka 프로듀서/리스너 코드

Producer: Kafka 메시지를 보내는 역할

@Component
public class DeliveryEventProducer {

    private final KafkaTemplate<String, String> kafkaTemplate;

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

    public void send(String topic, String message) {
        kafkaTemplate.send(topic, message);
        System.out.println("보낸 카프카 메시지 → " + message);
    }
}

Listener: Kafka 메시지를 받는 역할

@Component
public class DeliveryEventListener {

    @KafkaListener(topics = "test-topic", groupId = "smarteta-group")
    public void listen(String message) {
        System.out.println("받은 카프카 메시지: " + message);
    }
}

테스트용 Controller

@RestController
@RequestMapping("/kafka")
public class KafkaTestController {

    private final DeliveryEventProducer producer;

    public KafkaTestController(DeliveryEventProducer producer) {
        this.producer = producer;
    }

    @GetMapping("/send")
    public ResponseEntity<String> send() {
        producer.send("test-topic", "스프링과 카프카 연동 완료!");
        return ResponseEntity.ok("Sent!");
    }
}

5. Postman으로 테스트

요청 정보

항목
MethodGET
URLhttp://localhost:8080/kafka/send

결과 (콘솔)


profile
사용자의 입장에서 생각하며 문제를 해결하는 백엔드 개발자입니다✍

0개의 댓글