이벤트 드리븐 아키텍처(EDA)는 시스템 내에서 발생하는 이벤트(상태 변화나 사용자 행동)를 중심으로 시스템을 설계하는 소프트웨어 아키텍처 스타일입니다. EDA는 비동기적으로 이벤트를 처리하여 시스템의 응답성을 높이고, 서비스 간의 느슨한 결합을 통해 독립적인 개발과 배포가 가능하도록 합니다. 이러한 아키텍처는 대규모 시스템에서 특히 유용하며, 이벤트 발생 시 자동으로 적절한 서비스가 트리거되는 방식으로 동작합니다.
이벤트(Event): 시스템 내에서 발생하는 상태 변화나 행동을 나타내는 메시지입니다. 예를 들어, 사용자가 온라인 쇼핑몰에서 주문을 완료하면, '주문 생성'이라는 이벤트가 발생할 수 있습니다.
이벤트 소스(Event Source): 이벤트를 생성하여 이벤트 버스에 전달하는 역할을 합니다. 예를 들어, 주문 서비스는 '주문 생성' 이벤트의 소스가 될 수 있습니다.
이벤트 핸들러(Event Handler): 이벤트를 수신하여 처리하는 역할을 합니다. 예를 들어, '주문 생성' 이벤트를 수신한 재고 서비스는 재고를 확인하고 업데이트하는 작업을 수행합니다.
이벤트 버스(Event Bus): 이벤트 소스와 이벤트 핸들러 간의 메시지 전달을 중개하는 역할을 합니다. Kafka, RabbitMQ와 같은 메시지 브로커가 이벤트 버스의 역할을 할 수 있습니다.
느슨한 결합 (Loose Coupling):
확장성 (Scalability):
비동기 처리 (Asynchronous Processing):
복잡성 증가:
장애 전파:
이벤트 소스: 사용자가 온라인 쇼핑몰에서 주문을 완료합니다. 주문 서비스는 '주문 생성'이라는 이벤트를 발생시킵니다.
이벤트 버스: Kafka 또는 RabbitMQ와 같은 메시지 브로커가 '주문 생성' 이벤트를 이벤트 핸들러들에게 전달합니다.
이벤트 핸들러:
이 예시에서 각 서비스는 독립적으로 동작하며, 이벤트를 통해 필요한 작업을 수행합니다. 이는 서비스 간의 강한 결합을 피하고, 각 서비스가 개별적으로 확장 가능하도록 합니다.
Spring Cloud Stream은 마이크로서비스 아키텍처에서 이벤트 드리븐 애플리케이션을 쉽게 구축할 수 있도록 도와주는 프레임워크입니다. Spring Cloud Stream은 Kafka, RabbitMQ와 같은 메시지 브로커와의 통합을 지원하며, 이를 통해 이벤트 스트리밍을 간편하게 처리할 수 있습니다. 개발자는 복잡한 메시지 브로커와의 통합 작업을 간소화하고, 이벤트 프로듀서와 컨슈머 간의 통신을 추상화된 방식으로 처리할 수 있습니다.
바인더 추상화 (Binder Abstraction):
프로듀서/컨슈머 모델 (Producer/Consumer Model):
유연한 설정 (Flexible Configuration):
Spring Cloud Stream을 이용하여 이벤트 드리븐 애플리케이션을 개발하는 과정은 다음과 같습니다:
바인더 설정: 사용하고자 하는 메시지 브로커(Kafka, RabbitMQ 등)에 맞는 바인더를 설정합니다.
프로듀서 생성: 애플리케이션에서 이벤트를 발생시키는 프로듀서를 생성합니다. 예를 들어, 주문이 생성될 때 '주문 생성' 이벤트를 발생시킵니다.
컨슈머 생성: 이벤트를 수신하여 처리할 컨슈머를 생성합니다. 예를 들어, '주문 생성' 이벤트를 수신하여 재고를 업데이트하는 로직을 구현합니다.
애플리케이션 배포: 설정한 바인더와 함께 애플리케이션을 배포합니다. 애플리케이션은 메시지 브로커와 연결되어 이벤트를 주고받으며 동작합니다.
이와 같이 Spring Cloud Stream을 이용하면 복잡한 메시지 브로커와의 통합 과정을 단순화할 수 있으며, 이벤트 기반 애플리케이션을 보다 쉽게 구축할 수 있습니다.