이 프로젝트는 Spring Boot와 Spring Kafka를 사용하여 Kafka 메시지 생산자(Producer)와 소비자(Consumer)를 구현한 멀티 모듈 애플리케이션입니다. Kafka를 통한 메시지 기반 통신 시스템의 기본 구조를 제공합니다.
이 프로젝트는 다음과 같은 모듈로 구성되어 있습니다:
- producer: Kafka 메시지를 생성하고 전송하는 모듈
- consumer: Kafka 토픽에서 메시지를 구독하고 처리하는 모듈
각 모듈은 독립적으로 실행 가능한 Spring Boot 애플리케이션입니다.
- Kotlin 1.9.25
- Spring Boot 3.4.5
- Spring Kafka
- JDK 21
- Gradle (멀티 모듈 빌드)
- JDK 21
- Gradle 7.6 이상
- Kafka 서버 (로컬 또는 원격)
전체 프로젝트를 빌드하려면 프로젝트 루트 디렉토리에서 다음 명령어를 실행하세요:
./gradlew build특정 모듈만 빌드하려면 다음 명령어를 사용하세요:
./gradlew producer:build # Producer 모듈만 빌드
./gradlew consumer:build # Consumer 모듈만 빌드각 모듈은 독립적으로 실행할 수 있습니다. 두 모듈을 모두 실행하여 메시지 생산과 소비를 테스트할 수 있습니다.
./gradlew producer:bootRun또는 JAR 파일을 직접 실행:
java -jar producer/build/libs/producer-0.0.1-SNAPSHOT.jar./gradlew consumer:bootRun또는 JAR 파일을 직접 실행:
java -jar consumer/build/libs/consumer-0.0.1-SNAPSHOT.jarProducer 모듈은 REST API를 통해 메시지를 받아 Kafka 토픽으로 발행합니다. Consumer 모듈은 동일한 Kafka 토픽을 구독하여 메시지를 처리합니다.
기본 설정:
- Producer는 8070 포트에서 실행됩니다.
- Consumer는 8090 포트에서 실행됩니다.
- 두 모듈은 기본적으로 로컬 Kafka 서버(localhost:9092)에 연결됩니다.
각 모듈의 application.yml 파일을 수정하여 포트, Kafka 서버 주소 등의 설정을 변경할 수 있습니다.
Producer 모듈의 application.yml:
spring:
kafka:
producer:
bootstrap-servers: localhost:9092
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializerConsumer 모듈의 application.yml:
spring:
kafka:
consumer:
bootstrap-servers: localhost:9092
group-id: consumer-group
auto-offset-reset: earliest
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer각 모듈에 대한 자세한 정보는 해당 모듈의 README 파일을 참조하세요:
Docker Compose는 다중 컨테이너 Docker 애플리케이션을 정의하고 실행하기 위한 도구입니다. YAML 파일을 사용하여 애플리케이션의 서비스를 구성하고, 단일 명령으로 모든 서비스를 생성하고 시작할 수 있습니다.
Docker Compose를 사용하기 위해서는 Docker가 먼저 설치되어 있어야 합니다.
- Docker Desktop을 설치하면 Docker Compose가 함께 설치됩니다.
- Linux에서는 별도로 Docker Compose를 설치해야 할 수 있습니다.
프로젝트 루트 디렉토리에서 다음 명령어를 실행하여 Kafka 서버를 시작할 수 있습니다:
docker-compose up -d서비스를 중지하려면 다음 명령어를 사용합니다:
docker-compose down로그를 확인하려면:
docker-compose logs -f이 프로젝트의 docker-compose.yml 파일은 다음과 같은 특징을 가진 Kafka 서버를 설정합니다:
- KRaft 모드: Zookeeper 없이 Kafka를 실행합니다.
- Confluent Platform 7.4.1: Kafka 3.4.1을 포함하는 Confluent Platform을 사용합니다.
- 포트 설정:
- 9092: 내부 통신용 포트
- 29092: 외부 클라이언트 연결용 포트
- 데이터 영속성: 볼륨을 사용하여 Kafka 데이터를 영속적으로 저장합니다.
- 헬스체크: Kafka 서버가 정상적으로 시작되었는지 확인하기 위한 헬스체크가 구성되어 있습니다.
-
KRaft 모드 설정:
KAFKA_PROCESS_ROLES: broker와 controller 역할을 모두 수행KAFKA_NODE_ID: 노드 식별자KAFKA_CONTROLLER_QUORUM_VOTERS: 컨트롤러 쿼럼 구성KAFKA_CONTROLLER_LISTENER_NAMES: 컨트롤러 통신에 사용할 리스너 이름CLUSTER_ID: 클러스터 식별자
-
리스너 설정:
KAFKA_LISTENERS: 내부 및 외부 연결을 위한 리스너 설정KAFKA_ADVERTISED_LISTENERS: 클라이언트에게 알려질 리스너 주소
-
토픽 설정:
KAFKA_AUTO_CREATE_TOPICS_ENABLE: 토픽 자동 생성 활성화KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 오프셋 토픽 복제 팩터KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 트랜잭션 상태 로그 최소 ISRKAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 트랜잭션 상태 로그 복제 팩터
- Docker Compose를 사용하여 Kafka를 실행할 경우, 애플리케이션의 Kafka 연결 설정이 Docker 네트워크에 맞게 구성되어야 합니다.
- 로컬 개발 환경에서는
localhost:9092로 연결할 수 있습니다. - 실제 운영 환경에서는 보안, 성능, 안정성을 고려한 추가 설정이 필요할 수 있습니다.
- 애플리케이션을 실행하기 전에 Kafka 서버가 실행 중이어야 합니다.
- 토픽이 존재하지 않는 경우 자동으로 생성되도록 설정할 수 있습니다.