DDD 에서 이벤트 리스너가 내부적으로 어떤 패턴으로 구성되어 있는가?

- DDD(Domain-Driven Design) 에서 이벤트 리스너는 주로 도메인 이벤트를 처리하기 위해 설계됩니다.
이벤트 리스너는 도메인 이벤트가 발생했을 때, 이를 처리하거나 다른 시스템에 전파하는 역할을 합니다.
이벤트 리스너의 구성은 일반적으로 Observer 패턴 또는 Pub-sub 패턴을 기반으로 두고 있습니다.
이를 통해 이벤트가 발생하면 여러 리스너가 이를 구독하고 처리할 수 있습니다.
Observer 패턴 (옵저버 패턴)
- Observer 패턴은 주로 이벤트 리스너의 기본적인 구성 방식입니다.
이벤트가 발생하면 이를 구독한 여러 리스너가 각자 독립적으로 반응합니다.
DDD 에서 이벤트 리스너가 이 패턴을 사용하는 이유는 도메인 이벤트가 발생하면 여러 개의 구독자(Receiver)가 이를 처리할 수 있기 때문입니다.
구성 요소
Event (이벤트)
- 도메인 이벤트는 애플리케이션의 상태 변경을 나타내며,
예를 들어, "주문이 완료되었습니다.", "사용자가 등록되었습니다." 등이 될 수 있습니다.
Listener (옵저버)
- 이벤트가 발생하면 이를 처리하는 객체입니다.
여러 리스너가 같은 이벤트를 처리할 수 있습니다.
Publisher (발행자)
- 도메인 이벤트를 발생시키고 이를 리스너에게 알리는 역할을 합니다.
이 역할은 도메인 모델 내에서 이벤트를 발행하는 객체 또는 서비스가 수행됩니다.
Publish - Subscribe 패턴 (발행-구독 패턴)
- Pub-sub 패턴은 Observer 패턴을 발전시킨 형태로, 더 복잡한 시스템에서 이벤트를 처리하는 방식입니다.
이 패턴에서는 이벤트의 발행자와 리스너가 느슨하게 결합되어 있으며, 이벤트는 보통 메시지 큐나 이벤트 버스를 통해 전파됩니다.
DDD 에서는 주로 이 패턴을 사용하여 애플리케이션의 구성 요소들 간의 의존성을 줄이고, 이벤트의 확장성과 유연성을 제공합니다.
구성 요소
이벤트 발행자 (Publisher)
- 도메인 이벤트를 발생시키고, 이를 이벤트 버스나 큐에 게시합니다.
이벤트 리스너 (Subscriber)
- 이벤트 버스나 큐에서 특정 이벤트를 구독하고, 이벤트가 발생하면 이를 처리합니다.
이 리스너는 비동기적으로 이벤트를 처리할 수 있습니다.
이벤트 버스 (Event Bus)
- 이벤트를 전파하는 중앙 매개체로, 발행자가 이벤트를 게시하면 이벤트 버스가 이를 구독하는 리스너에게 전송합니다.
이벤트 처리 패턴
- DDD 에서 이벤트 리스너의 주요 역할은 도메인 이벤트가 발생했을 때, 비즈니스 로직을 처리하거나 다른 시스템과의 통합을 처리하는 것입니다.
이벤트 리스너는 일반적으로 다음과 같은 패턴으로 구현됩니다.
구성 요소
동기적 이벤트 처리
- 리스너가 이벤트를 처리하는 동안, 호출한 입장에서는 리스너가 작업을 완료할 때까지 기다립니다.
예를 들어, 트랜잭션 내에서 이벤트를 처리할 때 동기적 방식으로 처리할 수 있습니다.
비동기적 이벤트 처리
- 이벤트가 발생한 후 리스너가 처리하는 동안 호출 측이 기다리지 않습니다.
비동기적 처리 방식은 이벤트가 발생한 후 다른 비즈니스 로직을 차단하지 않고 빠르게 진행할 수 있게 해줍니다.
이벤트가 메시지 큐나 이벤트 버스를 통해 전파되고, 리스너가 이를 처리합니다.