본문 바로가기
카테고리 없음

Kafka Docker 이벤트연동

by sujupark54 2026. 2. 4.

카프카와 도커 이미지

이벤트 기반 아키텍처를 이해하기 위해 Kafka를 직접 설치해보려다 포기한 경험이 한 번쯤은 있을 것이다. Kafka와 Zookeeper를 로컬 환경에 직접 설치하려고 하면 운영체제별 설정 차이와 복잡한 환경 구성 때문에 학습 진입 장벽이 높게 느껴진다. 이럴 때 Docker를 활용하면 OS에 상관없이 동일한 환경을 빠르게 구성할 수 있다.

이 글에서는 Docker를 이용해 Kafka와 Zookeeper 서버를 띄우고, Spring Boot 애플리케이션에서 이벤트를 발행하고 읽는 전체 과정을 단계별로 정리한다. 도커 설치 이후부터 docker-compose 구성, Kafka 개념 정리, Spring Boot 연동과 실제 메시지 흐름까지 하나의 흐름으로 이해하는 것을 목표로 한다.


Kafka Docker 개발환경 구성

Docker는 컨테이너 기술을 통해 애플리케이션 실행 환경을 표준화해준다. Kafka처럼 여러 구성 요소가 함께 동작해야 하는 시스템은 Docker 환경에서 구성할 때 학습과 테스트가 훨씬 수월하다.

docker-compose는 여러 컨테이너를 하나의 스크립트로 정의하고 실행할 수 있게 해주는 도구다. Kafka는 Zookeeper와 함께 동작해야 하므로 docker-compose를 이용하면 두 컨테이너를 동시에 관리할 수 있다.

아래 구성에서는 Zookeeper와 Kafka 컨테이너를 각각 정의하고, 포트와 환경 변수를 명시해 로컬 개발 환경에서 바로 사용할 수 있도록 설정한다. 이 방식은 운영체제에 관계없이 동일하게 동작한다는 장점이 있다.


Kafka Docker docker-compose 설정

docker-compose 파일은 Kafka와 Zookeeper 서버를 동시에 실행하기 위한 핵심 설정 파일이다. Zookeeper는 Kafka 클러스터를 관리하는 역할을 담당하며, Kafka는 실제 메시지를 저장하고 전달하는 브로커 역할을 수행한다.

컨테이너가 정상적으로 실행되면 Docker Desktop이나 docker 명령어를 통해 실행 상태를 확인할 수 있다. CLI로 직접 접근할 수도 있지만, 이번 글에서는 Spring Boot 애플리케이션과 바로 연동하는 방식으로 진행한다.

docker-compose를 사용하면 서버를 종료하고 다시 실행하는 과정도 매우 간단하다. 학습용이나 테스트용 Kafka 환경으로는 가장 적합한 방식이다.


Kafka 구성요소 이해

Kafka를 제대로 이해하기 위해서는 기본 구성 요소를 먼저 살펴볼 필요가 있다. Kafka는 단순한 메시지 큐가 아니라 대용량 이벤트 스트리밍을 처리하기 위한 분산 시스템이다.

Zookeeper는 Kafka 클러스터의 메타데이터를 관리하며, 브로커 상태와 파티션 정보를 유지한다. Kafka 클러스터는 하나 이상의 브로커로 구성되며, 각 브로커는 메시지를 분산 저장하고 장애에 대비한 복제 기능을 수행한다.

Producer는 Kafka로 이벤트를 발행하는 주체이며, Consumer는 Kafka로부터 이벤트를 읽어오는 주체다. 이 구조 덕분에 시스템 간 결합도를 낮추고 비동기 이벤트 처리가 가능해진다.


Spring Boot Kafka 의존성 설정

Spring Boot 애플리케이션에서 Kafka를 사용하려면 spring-kafka 의존성을 추가해야 한다. 이 라이브러리는 Kafka Producer와 Consumer를 Spring 방식으로 쉽게 구성할 수 있도록 도와준다.

의존성을 추가하면 KafkaTemplate과 KafkaListener 같은 편리한 추상화를 사용할 수 있으며, 직접 Kafka Client를 다루는 복잡함을 줄일 수 있다.

테스트 환경에서는 spring-kafka-test 라이브러리를 함께 사용하면 Kafka 관련 테스트를 보다 안정적으로 작성할 수 있다.


Spring Boot Kafka Producer 설정

Producer는 Kafka 클러스터로 이벤트를 발행하는 역할을 수행한다. Producer 설정에서는 Kafka 서버 주소와 직렬화 방식이 핵심 요소다.

docker로 띄운 Kafka 서버는 localhost의 9092 포트를 통해 접근할 수 있다. 이 주소를 bootstrap server로 지정하면 Spring Boot 애플리케이션이 Kafka 브로커와 통신할 수 있다.

이벤트 메시지를 문자열로 처리하기 위해 Key와 Value를 모두 StringSerializer로 설정했다. 필요에 따라 JSON이나 다른 포맷으로 확장할 수도 있다.


Spring Boot Kafka Consumer 설정

Consumer는 Kafka에 저장된 이벤트를 읽어오는 역할을 담당한다. Producer와 마찬가지로 서버 주소와 역직렬화 설정이 중요하다.

ConsumerFactory와 KafkaListenerContainerFactory를 설정하면 @KafkaListener 어노테이션을 통해 이벤트를 비동기적으로 수신할 수 있다.

이 방식은 메시지 처리 로직을 비즈니스 코드와 분리할 수 있어 가독성과 유지 보수성이 뛰어나다.


Kafka 이벤트연동 실행 흐름

이제 실제로 두 개의 Spring Boot 애플리케이션을 실행해보자. 하나는 이벤트를 발행하는 Producer 역할을 수행하고, 다른 하나는 이벤트를 소비하는 Consumer 역할을 수행한다.

Producer 애플리케이션은 8200 포트에서 실행되며, HTTP 요청을 통해 Kafka로 이벤트를 발행한다. 이벤트는 order-topic이라는 토픽으로 전송된다.

Consumer 애플리케이션은 8100 포트에서 실행되며, order-topic을 구독하고 있다가 이벤트가 들어오면 콘솔에 메시지를 출력한다.

이 과정을 통해 Kafka 기반 이벤트 흐름이 애플리케이션 간에 어떻게 전달되는지 명확하게 확인할 수 있다.


Kafka Docker 이벤트연동 정리

Docker와 Kafka를 함께 사용하면 복잡한 설치 과정 없이 이벤트 기반 시스템을 빠르게 구성할 수 있다. docker-compose는 Kafka 학습과 테스트 환경을 구성하는 데 매우 강력한 도구다.

Spring Boot와 Kafka 연동은 Producer와 Consumer 설정만 정확히 이해하면 어렵지 않다. 이벤트 기반 아키텍처의 핵심 개념을 실습으로 익히기에 이 구조는 매우 좋은 출발점이 된다.

Kafka Docker 환경에서의 이벤트연동을 한 번 경험해두면, 마이크로서비스 아키텍처나 대용량 트래픽 처리 시스템을 이해하는 데 큰 도움이 될 것이다.