이벤트 발행자와 여러 이벤트 구독자들 간의 워크플로우를 관리/제어하는 방식으로 컴포넌트들은 이벤트 중재자에게 명시된 의존성을 가지며 중재자의 인터페이스를 알고 이를 통해 통신한다.
1. 이벤트 드리븐 아키텍처(EDA)란?
- 시스템의 컴포넌트들이 이벤트를 통해 통신하고 반응하는 구조이다.
- 컴포넌트들은 서로 직접 호출하지 않고, 관심 있는 이벤트에만 반응한다.
- 느슨한 결합(loose coupling)을 만들 수 있다.
이벤트 드리븐 아키텍처에는 대표적으로 이벤트 브로커 스타일과 이벤트 중재자 스타일이 있다.
2. 이벤트 중재자 스타일이란?
- 이벤트 발행자와 구독자가 직접 연결되지 않고, 중재자(Mediator)가 워크플로우를 제어하는 구조이다.
- 브로커와 다르게 중재자에 의존적(coupled)이다.
구성요소
- 이벤트 발행자: 이벤트 발생 (ex. 주문 생성)
- 이벤트 구독자: 이벤트를 처리 (ex. 배송 시작)
- 이벤트 큐: 이벤트 메시지 저장
- 이벤트 중재자: 워크플로우 제어 & 에러 처리 담당
3. 아키텍처 (토폴로지)

[발행자] → [이벤트 큐] → [중재자] → [구독자1]
→ [구독자2]
→ [구독자3]
중재자가 이벤트 흐름을 통제하고, 순서를 정의하며, 복잡한 워크플로우를 관리함
4. 이벤트 브로커 vs 이벤트 중재자
| 구분 | 이벤트 브로커 | 이벤트 중재자 |
|---|
| 통신 방식 | 발행자 → 브로커 → 구독자 (토픽/채널 기반 분산) | 발행자 → 중재자 → 구독자 (중재자가 흐름 제어) |
| 의존성 | 발행자/구독자 간 느슨한 결합 | 구독자들이 중재자에 강하게 의존 |
| 워크플로우 제어 | 어렵다 (흐름이 분산됨) | 용이 (중앙 집중 제어) |
| 확장성/성능 | 매우 높음 | 상대적으로 낮음 |
| 에러 처리/복구성 | 다소 제한적 | 강력하게 지원 |
| 사용 사례 | 대규모 이벤트 스트리밍 (Kafka, RabbitMQ) | 복잡한 업무 프로세스 (Apache Camel, Mule, ESB) |
5. 활용 예시
- 주문 배송 시스템
- 주문 생성 -> 결제 확인 -> 배송 지시 -> 고객 알림
- 중재자가 전체 프로세스를 순서대로 제어
- 구현 기술:
( Apache Camel, Mule, Spring Integration, Enterprise Service Bus(ESB)
시나리오: 온라인 쇼핑몰 주문
그래도 브로커와 중재자가 어떤 차이가 있는지 와닿지 않는다. 시나리오를 통해 고민해보자.
1. 이벤트 브로커 스타일 (Publish-Subscribe)
- 고객이 주문 생성 -> 주문 생성 이벤트 발생
- 브로커가 이 이벤트를 관심 있는 모든 구독자에게 전달
- 결제 서비스(결제 시작)
- 배송 서비스(배송 준비)
- 알림 서비스(문자/이메일 발송)
- 재고 서비스(재고 차감)
특징:
- 브로커는 이벤트를 뿌리는 역할만 함
- 구독자들은 이벤트가 오면 자기 할 일만 함
- 발행자는 누가 받았는지, 어떤 순서로 처리되는지 신경쓰지 않는다.
- 고객이 주문 생성 -> 주문 생성 이벤트 발행
- 중재자가 워크플로우를 제어
- 먼저 결제 서비스 호출 -> 결과 확인
- 결제가 성공하면 배송 서비스 호출
- 배송 준비가 끝나면 알림 서비스 호출
- 마지막에 재고 서비스 업데이트
특징:
중재자가 순서와 조건을 알고 있음
구독자(서비스들)는 중재자에게 의존
* 전체 프로세스를 시나리오대로 제어 가능
6. Apache Camel과 이벤트 중재자 스타일
1. Apache Camel이란?
- 오픈소스 통합 프레임워크 (Integration Framework)
- 다양한 시스템 간의 데이터 라우팅 & 변환을 쉽게 지원
- "Enterprise Integration Pattern(EIP)" 구현에 최적화
2. Camel에서의 이벤트 중재자
- 중재자 = Camel Route
- Camel에서는 "Route"가 발행자에서 구독자로 메시지를 이동시키는 경로이자 워크플로우 제어자 역할 수행
- 발행자: Producer (메시지 생성)
- 구독자: Consumer (메시지 소비)
- 이벤트 큐: JMS, Kafka, ActiveMQ 같은 메시지 브로커와 연결 가능
- 중재자: Camel이 제공하는 DSL(Domain Specific Language)을 사용해 라우팅/변환/워크플로우 제어
3. Camel Route 예시
from("jms:queue:order")
.choice()
.when(header("type").isEqualTo("payment"))
.to("bean:paymentService")
.when(header("type").isEqualTo("shipping"))
.to("bean:shippingService")
.otherwise()
.to("bean:loggingService");
- 주문(order) 이벤트가 들어오면, 중재자(Camel Route)가
type에 따라 결제 서비스/배송 서비스로 분기
- 이벤트 브로커 스타일에서는 단순히 발행/구독만 지원 -> 워크플로우 제어 어려움
- 이벤트 중재자 스타일(Camel)에서는 조건 분기, 변환, 순차 실행 등 복잡한 워크플로우 제어가능
각 작업을 비동기 방식으로 호출하는 것도 가능하다
from("jms:queue:payment")
.to("bean:paymentService");
from("jms:queue:shipping")
.to("bean:shippingService");
이렇게 봤을때 중재자 스타일의 본질은 워크플로우 제어를 중앙에서 관리하다이지
동기/비동기 여부는 선택적이다.
7. 장단점
장점
복잡한 워크플로우 제어 가능
에러 처리, 복구성, 데이터 일관성 보장
단점
구독자들이 중재자에 강하게 의존
브로커보다 확장성과 성능이 낮음
* 내고장성이 약하고, 워크플로우 모델링이 복잡