반응형
시스템 간 강결합의 문제
- 만약 외부 시스템과의 연동으로 서비스를 구축할 경우, 외부 시스템이 정상적으로 작동하지 않을때 트랜잭션 처리로 인한 롤백이 애매해지게 된다.
- 롤백 처리를 하지 않고 추후에 처리를 할 수 있겠지만 문제가 되는 외부시스템에서 응답 시간이 오래 걸리게 되면 내부 서비스에도 영향을 준다.
- 그리고 외부 시스템이 내부 시스템 코드에 영향을 주는 문제도 생길 수 있다.
- 이는 외부 시스템과의 문제뿐만 아니라 내부 시스템간에도 생길수 있는 문제들이다.
- 이러한 문제는 BOUNDED COUNTEXT 간에 강결합(high coupling) 때문이다.
- 이러한 문제를 해결하는 방법이 있는데 그것은 바로 이벤트를 사용하는 것이다.
이벤트 관련 구성요소
- 이벤트 핸들러(handler)는 이벤트 생성 주체가 발생한 이벤트에 반응한다.
- 이벤트 생성 주체와 이벤트 핸들러를 연결해 주는 것이 이벤트 디스패쳐(dispatcher)이다.
- 이벤트 발생 순서
- 이벤트 생성 주체는 이벤트를 생성해서 디스패처에 이벤트를 전달한다.
- 이벤트를 전달받은 디스패처는 해당 이벤트를 처리할 수 있는 핸들러에 이벤트를 전파한다.
- 이벤트 디스패처의 구현 방식에 따라 이벤트 생성과 처리를 동기나 비동기로 실행하게 된다.
이벤트의 구성
- 이벤트는 발생한 이벤트에 대한 정보를 담는다.
// 주문 배송지 변경에 대한 이벤트 디스패처 예제
@Getter
@AllArgsConstructor
public class ShippingInfoChangedEvent {
private final String orderNumber;
private final long timeStamp;
private final ShippingInfo newShippingInfo;
}
- 예제를 보면 현재 기준으로 과거에 벌어진 것을 표현하기 때문에 클래스명을 'Changed' 라는 과거 시제를 사용한다.
public class OrderChangeService {
@EventListener
public void ShippingInfoChange(ShippingInfoChangedEvent event) {
Order order = orderRepository.findByOrderNumber(event.getOrderNumber());
order.ShippingInfoChange(event.getNewShippingInfo(), event.getTimeStamp());
}
}
- 예제와 이벤트와 관련없는 데이터는 포함할 필요는 없다.
이벤트 용도
- 이벤트는 크게 두 가지 용도로 쓰인다.
트리거 용도
- 도메인의 상태가 바뀔때 다른 후처리를 해야 할 경우 후처리를 실행하기 위한 트리거로 이벤트를 사용할 수 있다.
서로 다른 시스템 간의 데이터 동기화
- 만약 주문의 배송지를 변경하면 외부 배송 서비스에 바뀐 배송지 정보를 전송해야 한다.
- 이럴 경우 배송지 변경 이벤트를 발생시키고 이벤트 핸들러는 외부 배송 서비스와 배송지 정보를 동기화 한다.
이벤트 장점
- 서로 다른 도메인 로직이 섞이는 것을 방지할 수 있다.
- 기능 확장에 용의하다.
반응형
'DDD' 카테고리의 다른 글
DDD(Domain-Driven Design) 계층구조(Layered Architecture) (0) | 2021.09.15 |
---|---|
JPA를 위한 스펙 구현 (0) | 2021.09.15 |
도메인 영역의 주요 구성요소 (0) | 2021.09.15 |
응용(Application) 영역과 표현(UI) 영역 (0) | 2021.09.15 |
도메인(Domain) 모델에 지켜야할것! (0) | 2021.09.15 |