본문 바로가기
  • Coding & Book
Back-End/Springboot

springboot에 kafka 설치하기

by 루이3 2025. 5. 15.

Kafka 도커 설정 (docker-compose.yml)

Kafka와 Zookeeper를 함께 실행하고, 웹 기반 Kafka UI도 포함하는 설정입니다.
해당 파일은 프로젝트 루트 혹은 별도 폴더(PROJECT-kafka)에 저장합니다.

특징 요약

  • Kafka + Zookeeper 한 번에 실행
  • Kafka 외부 포트: 9094
  • Kafka UI: http://localhost:8180
  • 실행 시 test라는 토픽 자동 생성
version: '3.8'

services:
  zookeeper:
    image: confluentinc/cp-zookeeper:7.6.0
    container_name: zookeeper
    ports:
      - "2181:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000

  kafka:
    image: confluentinc/cp-kafka:7.6.0
    container_name: kafka
    ports:
      - "9094:9094"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://0.0.0.0:9094
      KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka:9092,OUTSIDE://localhost:9094
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_CREATE_TOPICS: "test:1:1"
    depends_on:
      - zookeeper

  kafka-ui:
    image: provectuslabs/kafka-ui:latest
    container_name: kafka-ui
    ports:
      - "8180:8080"
    restart: always
    environment:
      KAFKA_CLUSTERS_0_NAME: PROJECT
      KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9092
      KAFKA_CLUSTERS_0_ZOOKEEPER: zookeeper:2181

 

실행 명령어

cd PROJECT-kafka
docker-compose up -d

컨테이너가 잘 실행되었는지 확인하려면:

docker ps

브라우저에서 http://localhost:8180 접속하면 Kafka UI를 확인할 수 있습니다.

 

Spring Boot 프로젝트 연동 설정

build.gradle

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

KafkaTemplate, @KafkaListener 등을 사용하기 위해 필요합니다.

application.properties

spring.kafka.bootstrap-servers=localhost:9094

spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer

spring.kafka.consumer.group-id=test-group
spring.kafka.consumer.auto-offset-reset=earliest
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer

 

 

Kafka 메시지 테스트

메시지 전송 API (Producer)

PROJECT에 kafka 패키지를 만들고 아래 Controller를 추가합니다.

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

    private final KafkaTemplate<String, String> kafkaTemplate;

    @PostMapping("/buy")
    public ResponseEntity<String> buyProduct(@RequestParam String username) {
        String message = username + "님이 상품을 구매했습니다";
        kafkaTemplate.send("test", message);
        return ResponseEntity.ok("전송 완료: " + message);
    }
}

예시 호출
POST /api/v1/kafka/buy?username=홍길동 → Kafka 토픽에 메시지 전송

메시지 수신 Consumer

@Component
public class KafkaConsumer {

    @KafkaListener(topics = "test", groupId = "test-group")
    public void consume(String message) {
        System.out.println("구매가 완료되었습니다: " + message);
    }

    @KafkaListener(topics = "test", groupId = "admin-group")
    public void consumeAsAdmin(String message) {
        System.out.println("관리자 확인: " + message);
    }
}

하나의 토픽을 두 개의 그룹이 각각 소비합니다. 콘솔 로그에서 수신 여부를 확인할 수 있습니다.

 

보안 설정 (Spring Security)

Kafka 테스트 API를 인증 없이 호출하려면 SecurityConfig에 다음 라인을 추가합니다:

.antMatchers("/api/v1/kafka/**").permitAll()

 

마무리

이 설정을 통해 Kafka를 로컬에서 간단히 실행하고, Spring Boot와 연동하여 메시지를 주고받는 전체 흐름을 확인할 수 있습니다. 테스트 및 학습용으로 유용하며, 실제 운영 시에는 보안 설정 및 클러스터 구성 등 추가 고려가 필요합니다.