이벤트 중재자

공부용·2025년 10월 2일

이벤트 발행자와 여러 이벤트 구독자들 간의 워크플로우를 관리/제어하는 방식으로 컴포넌트들은 이벤트 중재자에게 명시된 의존성을 가지며 중재자의 인터페이스를 알고 이를 통해 통신한다.

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)

  1. 고객이 주문 생성 -> 주문 생성 이벤트 발생
  2. 브로커가 이 이벤트를 관심 있는 모든 구독자에게 전달
    • 결제 서비스(결제 시작)
    • 배송 서비스(배송 준비)
    • 알림 서비스(문자/이메일 발송)
    • 재고 서비스(재고 차감)

특징:

  • 브로커는 이벤트를 뿌리는 역할만 함
  • 구독자들은 이벤트가 오면 자기 할 일만 함
  • 발행자는 누가 받았는지, 어떤 순서로 처리되는지 신경쓰지 않는다.

2. 이벤트 중재자 스타일 (Event Mediator)

  1. 고객이 주문 생성 -> 주문 생성 이벤트 발행
  2. 중재자가 워크플로우를 제어
    • 먼저 결제 서비스 호출 -> 결과 확인
    • 결제가 성공하면 배송 서비스 호출
    • 배송 준비가 끝나면 알림 서비스 호출
    • 마지막에 재고 서비스 업데이트

특징:
중재자가 순서와 조건을 알고 있음
구독자(서비스들)는 중재자에게 의존
* 전체 프로세스를 시나리오대로 제어 가능


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. 장단점

장점
복잡한 워크플로우 제어 가능
에러 처리, 복구성, 데이터 일관성 보장
단점
구독자들이 중재자에 강하게 의존
브로커보다 확장성과 성능이 낮음
* 내고장성이 약하고, 워크플로우 모델링이 복잡

profile
공부 내용을 가볍게 적어놓는 블로그.

0개의 댓글