Eventmanager에서 이벤트 발행/구독 과정에서 발생하는 이벤트를 영속화하는 저장소, Event Store에 대해 설명합니다. 1. Event Store 이벤트가 발행/구독될 때 원본 이벤트가 저장되는 저장소 입니다. 발행 이벤트 External Event는 Outbox Event Store, 구독 이벤트 Subscribed Event는 Inbox Event Store에 기록됩니다. 이벤트 저장소를 사용하는 이유는 이벤트 발행에 실패하거나 구독한 이벤트를 처리하는 로직에서 예외가 발생했을 경우 이벤트 저장소의 상태 데이터를 활용하여 로직을 다시 태울 수 있기 때문입니다. Eventmanager는 미발행된 이벤트를 재발행하고 처리되지 않은 이벤트를 재발행시켜 재처리될 수 있도록 스케쥴러를 활용하고 있..
Eventmanager의 구독 이벤트 저장 및 처리 로직을 설명합니다. 1. 구독 이벤트 저장 및 내부 이벤트 발행 구독 이벤트가 Message Queue에 적재되면 Eventmanager는 External Event를 Application Event인 Subscribed Event로 변환 후 발행시킵니다. Eventmanager가 Application Event로 변환 시켜주기 때문에 클라이언트는 Application Event(Spring Event)를 리스닝하는 Event Handler를 구현하여 이벤트 처리 로직을 직접 구현하면 됩니다. Subscribed Event에는 domain, objectName 필드가 있기 때문에 Event Handler의 condition 속성을 활용하여 원하는 도메인..
Eventmanager의 이벤트 발행 로직을 설명합니다. 1. 이벤트 저장 및 발행 도메인 객체의 상태를 변경하는 로직에서 Application Event가 External Event로 변환되어 추가적으로 발행된다고 했습니다. 변환된 External Event는 Eventmanager에서 처리합니다. 도메인 로직이 실패하면 이벤트 저장/발행 로직도 실패해야하기 때문에 Eventmanager는 Transactional Event Listener를 사용하여 도메인 로직과 동일한 Transaction에서 이벤트 저장/발행을 처리합니다. Transactional Outbox Pattern을 적용하여 이벤트를 도메인 로직 트랜잭션과 묶어 이벤트 저장소에 Commit하고 비동기적으로 Message Queue에 전달..
MSA 환경에서 Event-Driven Architecture(EDA)를 적용하게 되면서 도메인에서 핵심 비즈니스를 가지고 있는 도메인 객체의 상태 변화를 이벤트로 발행하고, 다른 도메인이 해당 도메인의 상태 변화를 구독할 수 있는 기능을 구현해야 했습니다. EDA를 처음 접하는 개발자들이 가능한 쉽게 이벤트를 발행/구독할 수 있도록 Eventmanager API를 개발했습니다. Eventmanager는 외부로 이벤트를 발행하고, 외부 도메인으로부터 이벤트를 구독하는 기능이 구현된 일종의 공통 코드입니다. 프로젝트 내에서 이벤트 발행/구독 기능을 사용하려면 Eventmanager를 의존하게끔 하여 기능을 캡슐화하고 추후 라이브러리화에 용이할 수 있도록 설계했습니다. 개발자가 발행하고 싶은 이벤트를 정의하..
Eventmanager에서 사용될 도메인 객체와 도메인 이벤트를 간략하게 설명합니다. 1. 도메인 객체(Domain Object) 도메인 객체는 핵심 비즈니스 로직의 주체로서 객체의 상태가 데이터베이스에 영속화됩니다. 실무적으로 DB 테이블과 1:1 매핑되는 필드를 가질 수 있습니다. 예를 들어, Layered Architecture가 적용된 프로젝트라고 가정하면 Application Layer의 WriteService에서 Transaction이 걸려 있을 때 호출하는 `repository.save(객체)` 메서드의 인자입니다. 이 객체의 상태가 변화될 때 도메인 이벤트를 발생시킵니다. 2. 도메인 이벤트(Domain Event) 핵심 비즈니스 로직을 가지는 도메인 객체의 상태 변경(C, U, D) 결과..