<aside>
1️⃣ Apache Kafka란?
</aside>
- Apache Kafka는 LinkedIn에서 개발되었고, 현재는 Apache Software Foundation의 일부로 오픈 소스로 제공되는 분산 스트리밍 플랫폼이다. Kafka는 실시간 데이터 피드를 관리하는데 사용되며, 빅 데이터 분석, 이벤트 처리, 로그 수집 등 다양한 시나리오에서 널리 활용된다.
<aside>
2️⃣ Kafka의 핵심 구성 컴포넌트
</aside>
- Producer:
- 데이터를 생성해서 Kafka로 보내는 역할을 한다. 예를 들어, 웹사이트의 사용자 클릭 이벤트를 감지하고 해당 이벤트를 Kafka로 보내는 애플리케이션을 생각해볼 수 있다.
- Broker:
- Kafka 시스템의 핵심 컴포넌트로, 데이터를 저장하고 전달하는 역할을 한다. Kafka는 분산 시스템으로 설계되어 있어서 일반적으로 여러 개의 브로커를 가지며, 이 브로커들은 클러스터를 형성한다.
- Topic:
- Kafka에서 데이터는 '토픽'이라는 추상화된 단위로 저장된다. 토픽은 여러 개의 파티션으로 나뉘어질 수 있으며, 각 파티션은 일련의 변경 불가능한 레코드를 가진다.
- Consumer:
- Kafka로부터 데이터를 읽어들이는 역할을 합니다. 컨슈머는 특정 토픽의 한 파티션 또는 여러 파티션에서 데이터를 읽을 수 있다.
- ZooKeeper:
- Kafka의 작동에 필요한 메타데이터를 저장하고, 브로커들 사이의 동기화를 유지해준다. 이 컴포넌트는 Kafka 클러스터의 신뢰성을 보장한다.
<aside>
3️⃣ Kafka의 주요 특징 및 장점
</aside>
- 분산 처리:
- Kafka는 대규모 데이터를 저장하고 처리할 수 있도록 분산 시스템으로 설계되어 있다. 이를 통해 고가용성과 내결함성을 보장한다.
- 실시간 처리:
- Kafka는 높은 처리량과 낮은 지연 시간을 제공하여, 실시간 스트림 데이터 처리에 적합하다.
- 내구성:
- Kafka는 데이터를 디스크에 저장하고, 브로커들 사이에 복제를 통해 데이터의 내구성을 확보한다.
- 프로듀서와 컨슈머의 분리:
- 프로듀서와 컨슈머는 서로 독립적으로 동작하므로, 각각의 처리량이나 속도에 영향을 주지 않는다.
- 이러한 특성들로 인해 Kafka는 실시간 분석, 로그 수집, 이벤트 소싱 등 다양한 분야에서 사용되고 있습니다.
<aside>
8️⃣ 이벤트 전용 클래스를 생성해서 데이터를 전송하는 이유
</aside>
- 서비스에서 따로 이벤트를 분리해 전송하는 것은 여러 가지 장점이 있다:
- 분리된 Concerns (관심사의 분리):
- 이벤트 발행은 도메인 로직과는 별개의 책임이다. 따라서 이벤트를 별도의 클래스로 분리하면, 각 클래스는 자신의 책임에만 집중할 수 있다. 이는 코드의 가독성과 유지보수성을 향상시키는 데 도움이 된다.
- 데이터의 일관성:
- 이벤트는 일반적으로 특정 상태 변화를 나타낸다. 이벤트를 통해 다른 시스템에도 이 상태 변화를 알림으로써, 시스템 간의 데이터 일관성을 유지할 수 있다.
- 탄력성:
- 이벤트 기반 아키텍처를 사용하면, 시스템은 서비스 간의 직접적인 의존성 없이도 서비스 간의 상호작용을 구현할 수 있다. 이를 통해 시스템의 탄력성을 향상시킬 수 있다.
- 확장성:
- 이벤트를 통해 시스템 간의 상호작용을 구현하면, 새로운 기능을 추가하거나 기존 기능을 변경하는 것이 더 쉬워진다. 예를 들어, 새로운 서비스를 추가하려면 그저 필요한 이벤트를 구독하면 된다.
- Audit trail (감사 추적):
- 이벤트는 시스템에서 무슨 일이 발생했는지에 대한 로그 또는 기록을 제공한다. 이는 문제 해결, 디버깅, 보안 감사 등에 유용하게 사용될 수 있다.
- 이러한 이유로, 서비스에서 이벤트를 분리하여 전송하는 패턴은 마이크로서비스 아키텍처, 이벤트 드리븐 아키텍처 등에서 널리 사용된다.
<aside>
9️⃣ 이벤트 클래스와 VO,DTO 클래스의 차이 및 사용방법
</aside>
- Spring Boot에서 Kafka 이벤트를 구현하는 방법에는 여러 가지가 있다. 그 중 일반적인 방법은 다음과 같다.
- VO 객체에 Kafka 이벤트를 위한 어노테이션 사용:
- VO 객체에 Kafka 이벤트를 전송하기 위한 어노테이션을 사용할 수 있다. 이 방식은 VO 객체에 이벤트와 관련된 정보를 직접 기술하는 방식이다. 예를 들어,
@KafkaEvent
어노테이션을 사용하여 VO 객체를 Kafka 이벤트로 표시할 수 있다. 그런 다음, Kafka Producer에서 해당 어노테이션이 지정된 VO 객체를 읽어들여 Kafka에 이벤트로 전송한다.
- VO와 별도의 Kafka 이벤트 클래스 사용:
- VO 객체와 별도의 Kafka 이벤트 클래스를 사용하는 방식이다. 이 경우, VO 객체는 주로 데이터 전달을 위한 목적으로 사용되고, Kafka 이벤트 클래스는 Kafka에 전송될 데이터를 포함하는 목적으로 사용된다. Kafka 이벤트 클래스에는 필요한 메타데이터나 기타 이벤트 관련 정보를 포함할 수 있다.