배달 관련 프로젝트를 진행하며 도커와 카프카 도입이 필요했다.
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
도커에서 잘 실행되고 있다!
implementation 'org.springframework.kafka:spring-kafka'
spring:
kafka:
bootstrap-servers: localhost:9092
consumer:
group-id: smarteta-group
auto-offset-reset: earliest
@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);
}
}
@Component
public class DeliveryEventListener {
@KafkaListener(topics = "test-topic", groupId = "smarteta-group")
public void listen(String message) {
System.out.println("받은 카프카 메시지: " + message);
}
}
@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!");
}
}
항목 | 값 |
---|---|
Method | GET |
URL | http://localhost:8080/kafka/send |