TIL 18 글에 이어서 도커 환경에서 kafka connect 까지 연결해야 하는 상횡이기에 추가 작성을 합니다!
왜 kafka connect를 사용해야할까 ?
Kafka 자체는 메시지를 받아 저장하는 시스템으로 DB 변경사항을 자동으로 읽고 Kafka로 보내주지 않기 때문이다.
"주문 서비스가 트래픽 증가하여 스케일 아웃을 고민하고 있는 상황이고, 주문 서비스 A, B, C가 각각의 독립적인 DB를 가지고 있게 되는데 DB가 독립적으로 존재하여 유저가 주문시에 주문 데이터는 A,B,C에 따로 저장이 된다."
즉, 전체 주문 목록리 한곳에 모이지 않게 된다.
그래서 사용자가 주문 전체 목록 조회를 하면 서비스 하나만 조회해도 일부만 보이게 되므로 데이터가 누락이 된다.
내 목표는 각 주문 서비스 인스턴스의 독립되어 있는 DB데이터를 Kafka로 모아서 하나의 통합 데이터로 만들고 싶은 것이 1차 목표이다.
이것을 Kafka Connect가 해결을 해준다.
Kafka Connect가 없다면 ?
각 주문 서비스가 주문 생성 시, 상태 변경 시에 직접 Kafka 프로듀서 로직을 작성해야 한다.
극단적이지만 10개의 인스턴스가 있다면 10번의 중복코드가 발생하는것이고,
누락/중복 처리, 재시도, 장애 복구 로직도 직접 구현해야 한다.
DB -> Kafka 로 데이터 싱크를 맞추는 코드또한 직접 전부 짜야 한다.
Kafka Connect 를 사용하면 ?
각 인스턴스 DB 변경이 자동으로 Kafka 로 흘러간다.
JDBC Source Connector 사용 시에 DB insert 발생하면 Connect 가 감지를 하고 Kafka 로 event를 발생시켜 넣어준다.
주문 서비스에서 코드 수정 필요가 없고, 인스턴스가 몇 개든 자동으로 수집을 할 수 있다.
docker-compose.yml
networks:
ecommerce:
external: true
services:
zookeeper:
image: confluentinc/cp-zookeeper:7.5.0
container_name: zookeeper
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
networks:
- ecommerce
kafka:
image: confluentinc/cp-kafka:7.5.0
container_name: kafka
ports:
- "9092:9092"
depends_on:
- zookeeper
environment:
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
networks:
- ecommerce
connect:
image: confluentinc/cp-kafka-connect:7.5.1
container_name: kafka-connect
depends_on:
- kafka
ports:
- "8083:8083"
environment:
CONNECT_BOOTSTRAP_SERVERS: kafka:9092
CONNECT_REST_PORT: 8083
CONNECT_REST_ADVERTISED_HOST_NAME: kafka-connect
CONNECT_REST_ADVERTISED_PORT: 8083
CONNECT_GROUP_ID: "connect-cluster"
CONNECT_CONFIG_STORAGE_TOPIC: connect-configs
CONNECT_OFFSET_STORAGE_TOPIC: connect-offsets
CONNECT_STATUS_STORAGE_TOPIC: connect-status
CONNECT_CONFIG_STORAGE_REPLICATION_FACTOR: 1
CONNECT_OFFSET_STORAGE_REPLICATION_FACTOR: 1
CONNECT_STATUS_STORAGE_REPLICATION_FACTOR: 1
CONNECT_KEY_CONVERTER: "org.apache.kafka.connect.storage.StringConverter"
CONNECT_KEY_CONVERTER_SCHEMAS_ENABLE: "true"
CONNECT_VALUE_CONVERTER: "org.apache.kafka.connect.json.JsonConverter"
CONNECT_VALUE_CONVERTER_SCHEMAS_ENABLE: "true"
CONNECT_PLUGIN_PATH: "/usr/share/confluent-hub-components"
volumes:
- .:/usr/share/confluent-hub-components
networks:
- ecommerce
네트워크를 넣어둔 이유는 트러블 슈팅글에서 작성을 하려고 한다..
jdbc connect download
위 사이트 들어가서 Confluent Platform를 다운로드 받아주면 된다.
그리고 각 프로젝트에서 사용하는 데이터베이스에 맞게 driver jar 파일도 다운로드 받아주면 된다.
총 1개의 zip 파일과, jar 파일 1개를 다운 받아서 zip 파일은 압축을 푼 폴더 그대로 넣어주고 jar 파일도 그대로 넣어주면 된다.
아래 폴더 구조를 참고!
폴더 구조
kafka/
├─ docker-compose.yml
└─ plugins/
├─ confluentinc-kafka-connect-jdbc-10.9.1/
│ ├─ kafka-connect-jdbc-10.9.1.jar
│ └─ (dependencies…)
└─ mysql-connector-j-8.3.0.jar
끝으로
정말 정말 정말 도커 환경에서 주키퍼, 카프카, 카프카 커넥터를 올리기 위해서 수 많은 빌드 과정이 있었다.
위에서 말을 하지 않았지만 connect 자체에서 jdbc를 지원하지 않는 이미지도 있고, connect 의 이미지도 여러가지 종류이다.
jdbc 드라이버를 못찾는 오류도 있었고, 도커로 빌드 과정속에서 log4j... 라는 오류를 내면서 빌드 실패도 여러 번 봤다..
정말 다음에는 만나기 싫어서 기억을 하고 싶은데 어떻게 작성을 해둘지 몰라 우선은 사용할 수 있는 버전으로 정리를 해둔거다..

'TIL & STUDY' 카테고리의 다른 글
| Nginx SSL 인증서 갱신 기록 (key.pem | cert.pem | dec_key.pem) (0) | 2026.06.18 |
|---|---|
| TIL 20 : Kafka INTERNAL/EXTERNAL Listener (1) | 2025.11.22 |
| TIL 18 : 도커로 주키퍼 & 카프카 실행 및 토픽 생성 테스트 (0) | 2025.11.19 |
| TIL 17 : 블로킹과 논블로킹 (0) | 2025.11.08 |
| TIL 16 : 데이터 삭제 요청 처리 방법과 자바 코테 연습등 기타 공부! (0) | 2025.10.09 |