이벤트 기반 아키텍처(EDA, Event-Driven Architecture)는 시스템 구성 요소들이 직접적으로 서로를 호출(Request-Response)하는 대신, 상태의 변화나 중요한 비즈니스 사건을 의미하는 '이벤트'를 발행(Publish)하고 소비(Subscribe)함으로써 협력하는 아키텍처 스타일이다. 이는 서비스 간의 결합도를 획기적으로 낮추고, 대규모 데이터 처리와 실시간 반응성이 요구되는 현대적 분산 시스템 및 마이크로서비스 환경에서 필수적인 설계 패러다임으로 자리 잡고 있다.
2. 주요 구성 요소 및 흐름
이벤트 생산자 (Event Producers): 비즈니스 사건이 발생했을 때 이를 탐지하고 이벤트 메시지를 생성하여 발행하는 주체.
이벤트 채널/브로커 (Event Channels/Brokers): 발행된 이벤트를 수집하고, 해당 이벤트에 관심 있는 소비자들에게 전달하는 매개체 (예: Apache Kafka, RabbitMQ, AWS SNS/SQS).
이벤트 소비자 (Event Consumers): 특정 이벤트를 구독하고 있다가, 이벤트가 도착하면 그에 따른 비즈니스 로직(핸들러)을 실행하는 주체.
이벤트 저장소 (Event Store): 발생한 이벤트들을 순차적으로 기록하여 추후 재생(Replay)이나 상태 복구에 활용하는 저장소.
3. 엔지니어링 가치
느슨한 결합 (Loose Coupling): 생산자는 누가 이벤트를 소비하는지 알 필요가 없으며, 소비자 역시 이벤트가 어디서 발행되었는지 알 필요가 없다. 이는 각 서비스의 독립적인 진화와 배포를 가능하게 한다.
높은 확장성 및 유연성: 이벤트 소비자를 자유롭게 추가하거나 제거할 수 있으며, 메시지 큐를 통한 버퍼링 효과로 갑작스러운 트래픽 증가(Spike)에도 시스템 전체가 마비되지 않고 유연하게 대응 가능.
실시간 반응성: 데이터가 발생한 즉시 관련 시스템들이 비동기적으로 반응하므로, 실시간 대시보드, 알림 서비스, 복잡한 워크플로우 처리에 최적화됨.
4. 트레이드오프 및 주의사항
디버깅 및 추적의 어려움: 직접적인 호출 스택이 존재하지 않으므로, 하나의 비즈니스 흐름이 여러 서비스를 거쳐갈 때 장애 발생 지점을 찾기 위해 분산 추적(Distributed Tracing) 도구 필수.
결과적 일관성 (Eventual Consistency): 분산 시스템의 특성상 데이터가 모든 곳에 즉시 반영되지 않을 수 있음을 전제로 설계해야 하며, 보상 트랜잭션(Saga Pattern 등)을 통한 예외 처리 필요.
멱등성 보장 (Idempotency): 네트워크 장애 등으로 동일한 이벤트가 중복 전달될 수 있으므로, 여러 번 처리해도 시스템 상태가 일관되게 유지되도록 핸들러를 멱등성 있게 구현해야 함.