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와 연동하여 메시지를 주고받는 전체 흐름을 확인할 수 있습니다. 테스트 및 학습용으로 유용하며, 실제 운영 시에는 보안 설정 및 클러스터 구성 등 추가 고려가 필요합니다.
'Back-End > Springboot' 카테고리의 다른 글
Spring Security에서 JWT 인증 필터 구현하기 (2) | 2025.03.18 |
---|---|
Spring Security 필터 기반 인증 처리 방식 (0) | 2025.02.17 |
Spring Security Filter 대해 알아보자 (1) | 2025.01.21 |
AOP 에 대해 알아보자 (0) | 2024.09.11 |
SpringBoot에서 Vue.js를 연동하고 실행해보자 (0) | 2024.05.04 |