CUD 요청 시 이벤트가 DB에 저장되고 Kafka에 발행되는 자세한 흐름
@CommandController 클라이언트에서 들어오는 들어오는 요청에 따라 NewPostCommand, EditMessageCommand, AddCommentCommand, EditCommentCommand, LikePostCommand, RemoveCommentCommand, DeletePostCommand의 커맨드 객체를 만든다.
@CommandController 요청에 따라 만들어진 커맨드 객체를 Dispatcher로 보낸다.
@CommandDispatcher Handler Dictionary를 통해 커맨드를 CommandHandler의 아규먼트로 넘겨준다.
- 이 Handler Dictionary는 프로그램이 시작될 때, Command/Program.cs에서 Dispatcher의 RegisterHandler 메소드를 통해 key(커맨드 타입): value(commandHandler.HandleAsync 함수) 페어로 저장된다.
- Dispatcher에 커맨드가 컨트롤러를 통해 넘어 올 경우, 커맨드가 commandHandler.HandleAsync의 아규먼트로 넘어간다.
@CommandHandler
- post를 새로 생성하는 경우에는, PostAggregate객체를 생성한다.
- post를 수정하거나, 삭제하거나, 커멘트에 관한 커맨드인 경우, EventSourcingHandler에서 getByIdAsync로 PostAggreate를 불러온다
@CommandHandler 4번에서 불러온 PostAggregate의 커맨드에 상응하는 메소드가 실행된다.
Ex1) EditMessageCommand일 경우, PostAggregate.EditMessage(message)가 실행된다.
Ex2) CommentAddedEvent일 경우, PostAggregate.AddComment(comment, username)이 실행된다.
@PostAggregate 메소드가 실행될 때, 커맨드가 실행되었다는 알림 event가 생성되고 부모클래스인 AggregateRoot의 RaiseEvent의 아규먼트로 이벤트가 전달된다.
@PostAggregate RaiseEvent에서 event를 아규먼트로 받아 ApplyChange 함수가 실행된다. 그러면 이벤트가 changes에 저장된다.
@CommandHandler PostAggregate의 함수가 실행된 후, PostAggregate를 Event Sourcing Handler의 saveAsync 메소드의 아규먼트로 전달한다.
@EventSourcingHandler EventStore의 SaveAsync가 실행된다.
여기서 중요한 일 두가지가 일어난다.
- @EventStore repository를 통해 uncommited change들이 Event Store DB에 저장된다.
- @EventStore EventProducer가 kafka에 json형식으로 이벤트를 정보를 넘긴다.
마지막으로 @EventSourcingHandler, aggregate.MarkChangesAsCommitted();로 change가 반영됐음을 표시해준다.