이벤트와 명령
자주 사용되는 중개(brokered) 메시지 유형으로 이벤트(events)와 명령(commands)이 있다. 두 메시지 유형은 구현의 일부가 비슷할 수 있지만 일반적으로 서로 다른 특징을 갖는다.
이벤트는 보통 이런 특징들을 갖는다.
- 시스템 상에서 발생한 사실을 묘사한다.
- 이미 과거에 벌어진 일이기 때문에 검증 대상이 아니다.
- 생산자가 정의한다. 따라서 소비자가 생산자에 물리적으로 또는 논리적으로 의존한다.
- 생산자는 소비자를 특정하지 않는다. 그래서 이벤트 전송 행위를 발행한다고 표현한다.
- 생산자는 이벤트 소비 효과를 염두하지 않는다.
반면 명령은 대개 이런 특징들을 갖는다.
- 생산자가 소비자에게 바라는 바를 기술한다.
- 소비자가 생산자의 요청을 수용할 수 있는지 검증한다.
- 소비자가 정의한다. 따라서 생산자가 소비자에게 물리적으로 또는 논리적으로 의존한다.
- 생산자는 소비자를 특정한다. 그래서 명령 전송 행위를 보낸다고 표현한다.
- 생산자는 소비자에게 기대하는 명령 소비 효과가 있다.
사례를 들어보자. 마케팅 시스템이 혜택 시스템에게 쿠폰 발급을 요청할 수 있다. 요청은 혜택 시스템에 의해 IssueCoupon
명령으로 정의되고 쿠폰 발급에 필요한 정보를 담는다. 혜택 시스템은 명령에 담긴 대상 사용자 식별자, 할인 금액, 유효기간 등을 검증하고 조건을 만족하지 않으면 쿠폰 발급을 실패시킬 수 있다.
쿠폰 발급이 성공하면 혜택 시스템은 CouponIssued
이벤트를 발행한다. CouponIssued
이벤트는 정산 시스템이 수신해 내용을 기록하고 이후 월 마감 작업에 이용한다. 또한 혜택 시스템은 발행된 쿠폰에 대한 정보를 담아 알림 시스템에 SendNotification
명령을 보낸다. 알림 시스템은 사용자에게 쿠폰 발행을 알리는 푸시 알림을 보낸다.
이들 시스템의 의존관계는 이렇다. 마케팅 시스템과 정산 시스템은 혜택 시스템에 의존한다. 혜택 시스템은 알림 시스템에 의존한다. 아키텍처 복잡도가 커질 수록 구성요소들의 의존관계 관리는 설계 품질에 큰 영향을 미친다. 메시지 성격에 따라서 의존관계가 달라질 수 있으니 이벤트와 명령을 배치할 때 관련 범위의 아키텍처를 충분히 고려하는 것이 좋다.