도메인 이벤트와 메시지 버스 돌아보기
이벤트
는
단일 책임 원칙
을 지키도록 돕는다.
한곳에서 여러 관심사를 처리하면 코드가 꼬여버린다.
이벤트를 사용하면
주된 유스 케이스
와
부수적인 유스 케이스
를 분리해 모든 것을 깔끔하게 유지할 수 있다.
이벤트를 사용해
애그리케이트
들이 서로 통신하고 여러 테이블을 락으로 잠그는 오랫동안 실행된
트랜잭션
이 더 이상 필요하지 않다
메시지 버스
는
메시지
를
핸들러
에게 연결한다
메시지 버스를 이벤트와
이벤트 소비자
를 연결하는 사전으로 생각할 수 있다
메시지 버스는 이벤트의 의미를 전혀 모른다.
메시지 버스는 단지 시스템에서 메시지를 전달하기 위한 둔한 인프라일 뿐이다.
첫번째 선택지:
서비스 계층
이 이벤트를 발생시키고
메시지 버스
에 전달한다
시스템에서 이벤트를 사용하는 가장 쉬운 방법은 작업 단위를 커밋한 직후
bus.handle
(어떤 새로운 이벤트)를 호출하는 것이다.
두번째 선택지:
도메인 모델
이 이벤트를 발생시키고 서비스 계층이 메시지 버스에 이벤트를 전달한다.
이벤트를 언제 발생시킬지 결정하는 논리는 모델과 함께 있어야 한다.
따라서 도메인 모델에서 이벤트를 발생시키면 시스템 설계와 시스템의 테스트 가능성으르 높일 수 있다
모델이 commit을 한 다음 핸들러가 이벤트를 찾아서 이벤트 버스에 싣는 것운 쉬운 일이다.
세번째 선택지:
UoW
가
애그리케이트
에서 이벤트를 수집해서 메시지 버스에 전달한다
bus.handle(aggreate.events)
를 모든 핸들러에 추가하는 작업은 성가시므로, 메모리에 적재한 객체들이 발생시키 이벤트를 작업 단위가 발생하도록 시스템을 간결하게 만든다.
이 방법은 가장 복잡한 설계이며 어쩌면
ORM
의 마법에 의존하는 것일 수 있지만, 일단 설정하고 나면 사용하기 쉽고 깔끔하다
관련 문서
Plugin Backlinks: 아무 것도 없습니다.