이벤트 드리븐 구현 샘플
참고 소스코드
- https://github.com/event-storming/orders
- https://github.com/event-storming/products
- https://github.com/event-storming/delivery
예제 설명
주문(order) 서비스와 상품(product) 서비스, 배송(delivery) 서비스의 관계가 Event-Driven 방식으로 호출을 하여 쇼핑몰을 구성합니다.
- 사용자가 주문을 하였을때, OrderPlaced 라는 이벤트를 Kafka 에 발송 합니다.
- 주문 서비스에서 OrderPlaced 라는 이벤트를 구독하여 재고량을 수정합니다.
- 배송 서비스에서 OrderPlaced 라는 이벤트를 구독하여 배송 시작을 합니다.
Order 서비스 Order.java
@Entity
public class Order {
@PostPersist
private void publishOrderPlaced(){
OrderPlaced orderPlaced = new OrderPlaced(this);
orderPlaced.publish();
}
}
Product 서비스 ProductService.java
@Service
public class ProductService {
@StreamListener(KafkaProcessor.INPUT)
public void onOrderPlaced(@Payload OrderPlaced orderPlaced) {
// 재고량 수정
<!--Optional<Product> productOptional = productRepository.findById(orderPlaced.getProductId());-->
Product product = productOptional.get();
product.setStock(product.getStock() - orderPlaced.getQuantity());
productRepository.save(product);
}
}
Delivery 서비스 DeliveryService.java
@Service
public class DeliveryService {
@StreamListener(KafkaProcessor.INPUT)
public void onOrderPlaced(@Payload OrderPlaced orderPlaced) {
// 배송 시작
deliveryRepository.save(delivery);
}
}