Spring

[Spring] Apache Kafka 이해하기

경상도상남자 2025. 4. 1. 11:56



 

내 채팅 시스템에 Kafka를 먼저 도입하기 전에 kafka가 어떤 건지 부터 알아가는 시간을 가져보자!!

 

 

 

Apache Kafka

- 실시간으로 스트림 데이터를 수집하고 처리하는 데 최적화된 ‘분산 이벤트 스트리밍 플랫폼(Distributed Data Streaming Platform)'

- 이는 실시간으로 발생하는 대량의 데이터를 중앙 허브를 통해 흐르도록 설계되어 있다.

- 데이터의 일관성을 유지하고 시스템 전반의 복잡성을 줄일 수 있음.

- 이러한 다량의 데이터는 A 지점에서 B 지점까지만의 데이터가 이동되는 것뿐만 아니라, A 지점에서 Z지점까지의 필요한 모든 곳에 대규모 데이터를 동시에 전달할 수 있어서
- 현대적인 데이터 파이프라인 구축에 필수적인 도구로 자리잡았으며, Netflix, LinkedIn, Uber 등 많은 기업들이 핵심 인프라로 사용하고 있다고 한다.

 

https://aws.amazon.com/ko/what-is/apache-kafka/

 

Kafka란? - Apache Kafka 설명 - AWS

Apache Kafka는 실시간으로 스트리밍 데이터를 수집하고 처리하는 데 최적화된 분산 데이터 스토어입니다. 스트리밍 데이터는 수천 개의 데이터 원본에서 연속적으로 생성되는 데이터로, 보통 데

aws.amazon.com

 

https://kafka.apache.org/

 

Apache Kafka

Apache Kafka: A Distributed Streaming Platform.

kafka.apache.org

 

더보기

[ 더 알아보기 ]

💡 Kafka에 의해 처리되는 스트림(Stream)과 스트리밍(Streaming)은 무엇일까?

- 스트림(Stream)이란 시간에 따라 연속적으로 발생하는 데이터의 흐름을 의미합니다.

- 예시) 실시간 주식 거래 데이터, SNS 피드, IoT 센서 데이터 등
- 스트리밍(Streaming)은 이러한 데이터 스트림을 실시간으로 처리하는 과정!!


💡 분산 이벤트 스트리밍 플랫폼(Distributed Event Streaming Platform)이란?

- 여러 서버에 걸쳐 이벤트 데이터를 실시간으로 처리하고 저장하는 시스템을 의미합니다.

- 주요한 특징은 분산 처리를 실시간으로 처리하며, 데이터 복제를 통해 장애 상황에서도 데이터 손실을 방지하며, 이벤트 발생 순서대로 처리하여 데이터의 일관성을 보장한다.

 

등장 배경

 

- 2011년 LinkedIn에서 처음 개발되었습니다. LinkedIn은 실시간으로 발생하는 대량의 사용자 활동 데이터(예: 프로필 조회, 메시지, 연결 요청 등)를 효율적으로 처리하고 분석해야 하는 과제에 직면했습니다.

 

 

Apache Kafka를 적용하기 전

 

Apache Kafka를 적용한 아키텍처

 

- 스트림 중심의 아키텍처로 구성이 되었고 이 설정에서 Kafka는 일종의 범용 데이터 파이프라인 역할을 한다.
- 각 시스템은 이 중앙 파이프라인에 공급하거나 공급받을 수 있다.
- 애플리케이션이나 스트림 프로세서는 이를 탭하여 새로운 파생 스트림을 생성할 수 있으며, 이는 다시 다양한 시스템에 공급되어 제공된다.

 

 

 

주요 특징

- 가장 주요한 특징은 '실시간 처리', '고가용성' 

- 데이터를 실시간으로 처리하면서, 시스템이 장시간 동안 중단 없이 지속적으로 운영될 수 있는 능력을 의미

 

높은 처리량

- 대용량 실시간 로그 데이터를 처리하는데 적합하며, 초당 수백만 건의 메시지를 처리할 수 있다.

 

확장 가능

- 최대 1,000개의 브로커, 하루 수조 개의 메시지, 페티바이트 규모의 데이터, 수십만 개의 파티션까지 프로덕션 클러스터를 확장할 수 있으며, 저장소와 처리를 탄력젹으로 확장하고 축소할 수 있다.

 

낮은 지연 시간

- 실시간 데이터 파이프라인을 구성하는데 적합한 밀리초 단위의 지연시간을 제공한다.

 

높은 가용성

- 가용성 영역에 걸쳐 클러스터를 호율적으로 확장하거나 여러 지리적 영역에 걸쳐 있는 개별 클러스터를 연결

 

영속성

- 디스크에 데이터를 저장하거나 데이터 영속성을 보장하며, 데이터 손실을 방지

 

 

🔍 주요 사용 사례

1. 실시간 스트리밍 애플리케이션

- 실시간으로 발생하는 데이터를 지속적으로 처리하고 분석하는 애플리케이션
- 예를 들어 실시간 로그 분석, 실시간 모니터링 시스템 등

 

2. 데이터 파이프 라인

 

- 데이터를 안정적으로 처리하고 한 시스템에서 다른 시스템으로 이동하며, 스트리밍 애플리케이션은 데이터 스트림을 소비하는 애플리케이션
- 예를 들어서, 사용자 활동 데이터를 받아 사람들이 웹사이트를 어떻게 사용하는지 실시간으로 추적하는 데이터 파이프라인을 만들려면 Kafka를 사용하여 스트리밍 데이터를 수집 및 저장하면서 데이터 파이프라인을 구동하는 애플리케이션에 읽기 서비스를 제공할 수 있다.



3. 메시징 시스템(브로커)


- 애플리케이션 간의 메시지 전달을 중개하는 미들웨어 시스템입니다. 발신자(Producer)와 수신자(Consumer) 사이에서 메시지를 전달하는 중간 역할을 수행합니다.

 

 

사용 사례 설명
스트리밍 애플리케이션 실시간 데이터 스트림을 처리하는 애플리케이션을 구축하여 즉각적인 분석과 대응이 가능합니다.
메시징 시스템 애플리케이션 간의 비동기 통신을 위한 메시지 브로커 역할을 수행하며, 시스템 간 안정적인 데이터 전달과 통신을 중재합니다.
데이터 파이프라인 실시간 데이터를 수집하고 저장하면서 다른 시스템으로 안정적으로 전달하는 파이프라인을 구축합니다.
활동 추적 웹사이트나 애플리케이션의 사용자 행동 데이터를 실시간으로 수집하고 분석하여 사용 패턴을 파악합니다.
로그/메트릭 수집 여러 서비스의 로그와 성능 지표를 중앙 집중화하여 모니터링하고 관리합니다.

 

 

⚒️ Apache Kafka vs RabbitMQ

- 주요한 차이점은 Kafka는 '분산 스트리밍 플랫폼'이고 RabbitMQ는 '메시지 브로커'

- 즉, Kafka의 경우 메시지 브로커의 역할도 수행하며, 데이터 스트림의 저장, 처리, 실시간 분석 등 광범위한 데이터 처리 기능을 제공하며 이는 더 포괄적인 개념이라고 할 수 있다.

 

특성 Apache Kafka RabbitMQ
아키텍처 분산 스트리밍 플랫폼 메시지 브로커
프로토콜 TCP를 이용한 바이너리 프로토콜 메시징 큐 프로토콜(AMQL) : MQTT, STOMP
메시징 모델 발행-구독(Pub/Sub) 기반 스트리밍, 대기열(Queue) 모델 메시지 큐잉과 라우팅 중심
성능 대용량 데이터 처리에 최적화 (높은 처리량) 낮은 지연시간, 중소규모 메시징에 적합
데이터 보존 설정된 기간동안 데이터 보존 (영속성) 메시지 전달 후 즉시 삭제
확장성 수평적 확장이 용이, 대규모 확장 가능 수직적 확장 중심, 중소규모에 적합
사용 사례 로그 수집, 스트림 처리, 이벤트 소싱 마이크로서비스 간 통신, 작업 큐
메시지 순서 파티션 내에서 순서 보장 FIFO 큐에서 순서 보장
복잡성 설정과 운영이 상대적으로 복잡 설정과 운영이 비교적 간단

 

Apacke Kafka 모델

 

1. 대기열(Queue) 모델


- 생성자(Producer)가 생성한 데이터를 여러 소비자(Consumer)에게 분산하는 기능을 합니다. 해당 모델은 여러 소비자(Consumer)가 동시에 구독할 수 없다는 한계가 있습니다.
- 즉, 생성자는 데이터를 큐에 적재하고 큐에서는 순차적으로 데이터가 추출되기에 모든 소비자에게 동시에 전달이 아닌 순차적으로 전달이 됩니다.
- 이를 통해서 순서가 보장이 되며, 메시지 중복 처리를 방지하고 작업을 분산하는데 효과적인 방법입니다.

 

💡 대기열(Queue) 모델 처리 과정

1. 생성자(Producer) → 데이터(Data) → 대기열(Queue)

- 생성자는 애플리케이션이나 서비스를 의미하며, 대기열(Queue)로 스트림 데이터를 전송합니다.
- 전송된 데이터는 대기열(Queue)에 FIFO(First In First Out) 형태로 순차적으로 적재가 됩니다.

2. 대기열(Queue) → 소비자(Consumer)
- 대기열(Queue)에 있는 데이터는 소비자(Consumer)가 하나씩 가져가서 처리합니다.
- 데이터는 순차적으로 처리되며, 하나의 데이터는 하나의 소비자에 의해서만 처리됩니다.
- 소비자가 데이터를 성공적으로 처리하면 해당 데이터는 대기열에서 제거됩니다.

 

 

2. 게시-구독(Publish-Subscribe) 모델

- 게시자(Publisher)가 발행한 메시지를 여러 소비자(Consumer)가 동시에 구독하고 처리할 수 있다. 각 소비자는 독립적으로 메시지를 받아 처리할 수 있다.

- 작업 부하를 분산하기 위해서는 각 구독자가 서로 다른 메시지를 처리해야 하는데 게시-구독 모델에서는 모든 구독자가 동일한 메시지를 받기 떄문에 이것이 불가능하다.

- 즉, 해당 모델에서는 하나의 메시지가 모든 구독자에게 복사되어 전달이 된다. 예를 들어서, 메시지 A가 발행되면 구독자 1, 2, 3에게 모두 동일한 메시지 A가 전달이 된다.

 

1. 게시자(Publisher) → 데이터(Data) → PubSub(Publisher Subsciber)
- 게시자는 애플리케이션이나 서비스를 의미하며, 데이터를 스트림 형태로 발행(Publish)합니다.

2. PubSub(Publisher Subsciber) → 구독자(Subscriber)
- 발행된 스트림 데이터는 이를 구독(Subscribe)하고 있던 모든 구독자(Subsciber)에게 전달이 됩니다.
- 전달된 구독자는 Single Consumer에게 전달되거나 혹은 여러 Consumer(Consumer Group)에게 다시 전달이 됩니다.

 


Apache Kafka 구요소

- 각 요소들은 유기적으로 연결되어 분산 스트리밍 플랫폼으로서의 기능을 수행합니다. 

 

 

구성 요소  설명 주요 특징
생성자(Producer) 메시지를 생성하고 발행하는 애플리케이션 - 동기/비동기 전송 지원
- 파티션 분배 역할
- 메시지 신뢰성 보장
소비자(Consumer) 토픽으로부터 메시지를 구독하고 읽는 애플리케이션 - 메시지 오프셋 관리
- 자동/수동 커밋
- 병렬 처리 가능
소비자 그룹(Consumer Group) 협력하여 메시지를 처리하는 소비자들의 집합 - 자동 로드 밸런싱
- 장애 복구 기능
- 파티션별 할당
파티션(Partition) 토픽을 나누는 물리적 단위 - 병렬 처리 지원
- 순서 보장
- 확장성 제공
토픽(Topic) 메시지가 저장되는 논리적 단위 - 카테고리 분류
- 다중 구독 가능
- 영구 저장소
오프셋(Offset) 파티션 내 각 메시지의 고유한 위치 식별자 - 메시지 순서 보장
- 소비 위치 추적
- 재처리 가능
브로커(Broker) 카프카 서버 - 메시지 저장/관리
- 복제 관리
- 장애 복구
카프카 클러스터(Kafka Cluster) 여러 브로커들의 분산 시스템 집합 - 고가용성 보장
- 확장성 제공
- 부하 분산

 

1. 생성자(Producer)

- Kafka에서 메시지를 생성하고 발행하는 애플리케이션이나 서비스를 의미

- 동기/비동기 전송을 지원하고, 다양한 설정으로 성능과 신뢰성을 조절할 수 있다.

- 생성된 메시지를 토픽의 특정 파티션에 분배하는 역할을 한다.

 

 

기능 설명 세부 사항
메시지 발행 토픽에 데이터를 전송하는 역할을 담당합니다.  
파티션 할당 메시지를 특정 토픽의 파티션에 분배하는 역할을 합니다. - Round-Robin: 순차적으로 파티션에 할당
- Key-based: 메시지 키를 기반으로 특정 파티션에 할당
- Custom: 사용자 정의 파티션 전략 사용
신뢰성 보장 메시지 전송의 신뢰성 수준을 설정합니다. - acks=0: 메시지 전송 후 응답을 기다리지 않음
- acks=1: 리더 파티션의 응답만 기다림
- acks=all: 모든 복제본의 응답을 기다림
배치 처리 성능 향상을 위해 여러 메시지를 묶어서 한 번에 전송할 수 있습니다.  

 

 

2. 소비자(Consumer)

- Kafka Topic으로부터 메시지를 구독(Subscribe)하고 읽어오는 애플리케이션이나 서비스를 의미.
- 하나 이상의 토픽을 구독(Subscribe)하여 메시지를 지속적으로 소비한다. 구독 과정에서 특정 토픽의 파티션에 할당되어 메시지를 읽어온다.
- Consumer Group을 통해 여러 Consumer가 협력하여 병렬 처리가 가능하다.

 

 

 

기능 설명 세부 사항
메시지 소비 토픽으로부터 메시지를 읽어오는 기본적인 기능을 수행합니다. - 자동/수동 커밋 지원
- 오프셋 관리
Consumer Group 여러 Consumer를 그룹화하여 병렬 처리를 가능하게 합니다. - 파티션당 하나의 Consumer 할당
- 자동 로드 밸런싱
- Failover 지원
오프셋 관리 메시지 소비 위치를 추적하고 관리합니다. - earliest: 가장 처음부터 소비
- latest: 최신 메시지부터 소비
- 특정 오프셋부터 소비
재조정(Rebalancing) Consumer Group 내에서 파티션을 재분배합니다. - Consumer 추가/제거시 자동 재조정
- 장애 발생시 자동 복구

 

 

3. 소비자 그룹 (Consumer Group)

- 하나의 토픽에 대해 협력하여 메시지를 처리하는 소비자(Consumer)들의 집합을 의미한다. 즉, 동일한 토픽을 구독하는 소비자들의 논리적인 그룹이다.

- 하나의 파티션은 동일한 Consumer Group 내에서 하나의 Consumer에만 할당된다.
- 파티션의 수보다 Consumer가 많으면 일부 Consumer는 유휴 상태가 된다.
- 예를 들어서 하나의 토픽에는 3개의 파티션이 있고 Consumer Group 내에 2개의 Consumer가 있다고 가정한다.
- 이때는, Consumer 1은 파티션 1, 2를 처리하고, Consumer 2는 파티션 3을 처리하여 하나의 토픽에 대해 협력하여 처리한다.

 

유휴 상태?? : 컴퓨터 시스템이 사용 가능한 상태이나 실제적인 작업이 없는 상태

 

 

 

기능 설명 세부사항
로드 밸런싱 파티션을 Consumer들에게 균등하게 분배합니다. - 자동 파티션 할당
- Consumer 수에 따른 동적 조정
- 효율적인 부하 분산
장애 복구 Consumer 장애 시 자동으로 재조정됩니다. - 자동 리밸런싱
- 장애 Consumer 감지
- 파티션 재할당
확장성 Consumer를 추가하여 처리량을 증가시킬 수 있습니다. - 동적 Consumer 추가/제거
- 수평적 확장 가능
- 파티션 수 제한
오프셋 관리 그룹 단위로 메시지 소비 위치를 추적합니다. - 중복 처리 방지
- 그룹별 독립적 관리
- 커밋 포인트 저장

 

 

더보기

[ 더 알아보기 ]

💡 Consumer Group 병렬 처리는 어떻게 수행이 될까?

- 예를 들어서, 하나의 토픽 내에 파티션이 6개가 있고, Consumer Group 내에는 3명이 있다고 가정하자
- 이때, Consumer 1은 P1, P2를 처리하고 Consumber2는 P3, P4를 처리하고 Consumer 3에서는 P5, P6를 처리합니다.
- 이를 통해서 독립적으로 분산 처리를 수행하게 됩니다.

 

4. 메시지(Message)

- Kafka에서 데이터를 전송하는 기본 단위이다.

- 키(Key), 값(Value), 타임스탬프(Timestamp)로 구성되며, 선택저긍로 헤더(Headers)를 포함할 수 있다.

- 메시지는 한번 기록되면 변경할 수 없는 불변(lmmutable) 특성을 가진다. 

 

 

 

구성요소  설명 특징
키(Key) 메시지를 식별하는 선택적 메타데이터 - 파티션 결정에 사용
- 동일한 키는 동일한 파티션에 저장
- null 가능
값(Value) 실제 전송하려는 데이터 내용 - 바이트 배열 형태로 저장
- 다양한 형식 지원 (JSON, Avro, 등)
- 압축 가능
타임스탬프 메시지가 생성된 시간 정보 - 메시지 순서 보장
- 데이터 추적
- 보존 정책에 활용
헤더 추가적인 메타데이터를 저장 - 키-값 쌍으로 구성
- 선택적 사용
- 애플리케이션별 커스텀 정보 저장

 

 

 

5. 파티션(Patition)

 

- 토픽을 여러 개의 파티션으로 나누어 병렬 처리를 가능하게 하는 물리적 단위
- 각 파티션은 순서가 있는 불변의 시퀀스로 구성되며, 고유한 오프셋을 가진다
- 파티션을 통해 데이터를 여러 브로커에 분산 저장하여 높은 처리량과 확장성을 제공

 

 

 

기능 설명 세부사항
병렬 처리 토픽의 데이터를 여러 파티션으로 분할하여 동시 처리를 가능하게 합니다. - 높은 처리량 제공
- 수평적 확장성 지원
- 다중 컨슈머 병렬 처리
순서 보장 각 파티션 내에서 메시지의 순서가 보장됩니다. - 파티션 내 순차적 오프셋
- FIFO(First In First Out) 방식
- 파티션 간 순서는 보장되지 않음
복제 데이터 안정성을 위해 파티션을 여러 브로커에 복제합니다. - 리더-팔로워 구조
- 복제 팩터 설정
- 자동 장애 복구
로드 밸런싱 파티션을 통해 브로커 간 부하를 분산합니다. - 균등한 데이터 분배
- 효율적인 리소스 활용
- 동적 파티션 재분배

 

 

6. 토픽(Topic)

- Kafka에서 메시지가 저장되는 논리적인 채널 또는 피드의 이름

- 생성자(proceduer)가 메시지를 발행하고 소비자(consumer)는 이를 구독하는 대상이 된다.

- 하나의 토픽은 여러 개의 파티션으로 분할될 수 있다.

 

기능 설명 세부사항
메시지 구성 토픽은 관련된 메시지들의 스트림을 구성합니다. - 메시지는 키-값 쌍으로 구성
- 시간 순서로 저장
- 고유한 오프셋 보유
확장성 파티션을 통해 수평적 확장이 가능합니다. - 다수의 파티션으로 분할 가능
- 파티션별 독립적 처리
- 병렬 처리 지원
데이터 보존 설정된 보존 정책에 따라 메시지를 유지합니다. - 시간 기반 보존
- 크기 기반 보존
- 압축 로그 지원
접근 제어 토픽별로 접근 권한을 관리할 수 있습니다. - 읽기/쓰기 권한 설정
- ACL 기반 보안
- 다중 구독자 지원

 

 

7. 오프셋 (Offset)

- 파티션 내에서 각 메시지를 고유하게 식별하는 순차적인 ID 번호

- 파티션 내에서 순차적으로 증가하는 정수값으로, 메시지의 위치를 나타낸다.

- Consumer가 어디까지 메시지를 읽었는지 추적하는 데 사용된다.

 

- 예를 들어서, 데이터 1, 2, 3, 4, 5, 6이라는 값이 순차적으로 Topic 내에 파티션에 들어있다고 가정하에 Consumer는 3개 있을 때가 가정하에 있다.

- 이는 Consumer Group을 이루어서 Consumer 1은 1, 4 오프셋을 찾아서 데이터를 가져오고, Consumer2는 2, 5를 가져오고 Consumer3은 3, 6의 값을 가져오는 서로 다른 파티션을 병렬 처리를 수행한다.

 

💡 아래의 그림에서 Consumer 1, Consumer2에서는 Topic 내에 Partition을 가져오는 역할을 수행하고 있다.

- Consumer 1은 offset 4라는 값과 Consumer2는 offeset 3이라는 값을 가리키고 있어서 각각의 순차적인 ID 번호 값을 가져오는 역할을 수행합니다.

 

구성요소  설명 세부사항
시작 오프셋 파티션에서 가장 오래된 메시지의 위치 - earliest: 가장 처음 메시지부터 읽기
- 보관 정책에 따라 변경될 수 있음
현재 오프셋 Consumer가 현재까지 읽은 위치 - Consumer Group별로 관리
- 자동/수동 커밋 가능
최신 오프셋 파티션에서 가장 최근에 추가된 메시지의 위치 - latest: 최신 메시지부터 읽기
- Producer가 새 메시지 추가시 증가
커밋된 오프셋 Consumer가 성공적으로 처리했다고 표시한 위치 - 중복 처리 방지
- 장애 복구시 활용
- Consumer Group별 독립적 관리

 

 

8. 브로커 (Broker)

- Kafka 클러스터를 구성하는 서버 단위입니다. 이는 메시지를 수신하고 저장을 담당하는 역할을 의미합니다.
- 생성자(Producer)로부터 전달받은 토픽의 파티션을 저장하고 관리하는 역할을 합니다.
- 소비자(Consumer)로부터 요청에 따라 저장된 메시지를 전달하는 역할을 수행합니다.
- 생성자와 소비자 간의 메시지 전달을 중개하는 역할을 수행합니다.

- 카프카 클러스터(Kafka Cluster)내에서 각 브로커 마다 고유한 ID를 가지며, 다른 브로커들과 협력하여 데이터를 복제하고 동기화를 수행합니다.

 

 

 

 

기능 설명 세부 사항
메시지 저장 토픽의 파티션을 디스크에 저장하고 관리합니다. - 설정된 보관 기간 동안 메시지 보존
- 디스크 기반 저장으로 영속성 보장
복제 관리 데이터의 안정성을 위해 파티션 복제본을 관리합니다. - 리더와 팔로워 파티션 관리
- 자동 장애 복구 지원
- 복제 팩터 설정 가능
부하 분산 클러스터 내에서 데이터와 요청을 분산 처리합니다. - 파티션의 균등한 분배
- 네트워크 트래픽 분산
- 리소스 사용 최적화
컨트롤러 기능 클러스터 내 리더 선출과 관리를 담당합니다. - 브로커 상태 모니터링
- 파티션 리더 선출
- 클러스터 메타데이터 관리

 

 

9. 클러스터(Cluster)

- 여러 대의 브로커(Broker)들이 모여 구성된 분산 시스템이다.

- 각 브로커들은 서로 협력하여 데이터를 안전하게 저장하고 처리한다.

 

 

 

기능 설명 세부사항
고가용성 클러스터 내 복제를 통해 안정성을 보장합니다. - 브로커 장애 시 자동 복구
- 데이터 복제
- 무중단 운영 지원
확장성 필요에 따라 브로커를 추가하여 확장할 수 있습니다. - 수평적 확장 가능
- 동적 클러스터 조정
- 부하 분산
관리 기능 클러스터의 상태를 모니터링하고 관리합니다. - 브로커 상태 감시
- 리소스 사용량 추적
- 성능 모니터링
데이터 분산 여러 브로커에 걸쳐 데이터를 분산 저장합니다. - 파티션 분산
- 균형있는 저장소 사용
- 효율적인 데이터 접근

 

 

출처

 

전 이분의 기록을 따라 쓰면서 공부만 했습니다. 공부하실려면 이분꺼 보세용 설명 기깔납니다!!

 

https://adjh54.tistory.com/636#3.%20%EC%86%8C%EB%B9%84%EC%9E%90%20%EA%B7%B8%EB%A3%B9(Consumer%20Group)-1-11

 

[OpenSource] Apache Kafka 이해하기 -1: 주요 모델 및 구성요소

해당 글에서는 Apache Kafka에 대해 이해를 돕기 위해 작성한 글입니다.  💡 [참고] Docker 기반의 초기 Apache Kafka 구성이나 혹은 Apache Kafka 이론에 대해 궁금하시면 아래의 글을 참고하시면 도움이

adjh54.tistory.com