Skip to content

Commit 4a1aa52

Browse files
committed
refactor: OrderCreatedEvent가 상세 정보를 스스로 포함하도록 개선
- 이벤트 리스너의 외부 서비스 의존성 제거 (Decoupling) - 이벤트 객체가 발생 시점의 상태(재고)를 온전히 표현하도록 수정 - 비동기 처리 시 발생할 수 있는 데이터 불일치 가능성 방지
1 parent e667da8 commit 4a1aa52

3 files changed

Lines changed: 15 additions & 6 deletions

File tree

apps/commerce-api/src/main/java/com/loopers/application/order/OrderFacade.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ public OrderInfo placeOrder(PlaceOrder command) {
6767
order.getId(),
6868
user,
6969
orderItems,
70+
products,
7071
finalPaymentAmount,
7172
command.paymentType(),
7273
command.cardType(),

apps/commerce-api/src/main/java/com/loopers/application/order/event/OrderCreatedEvent.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22

33
import com.loopers.domain.order.OrderItem;
44
import com.loopers.domain.payment.PaymentType;
5+
import com.loopers.domain.product.Product;
56
import com.loopers.domain.user.User;
67
import java.util.List;
8+
import java.util.Map;
79
import java.util.UUID;
10+
import java.util.stream.Collectors;
811

912
public record OrderCreatedEvent(
1013
String eventId,
@@ -18,24 +21,31 @@ public record OrderCreatedEvent(
1821
Long couponId
1922
) {
2023

21-
public record OrderItemInfo(Long productId, int quantity) {
24+
public record OrderItemInfo(Long productId, int quantity, int remainStock) {
2225

2326
}
2427

2528
public static OrderCreatedEvent of(
2629
Long orderId,
2730
User user,
2831
List<OrderItem> orderItems,
32+
List<Product> products,
2933
long finalAmount,
3034
PaymentType paymentType,
3135
String cardType,
3236
String cardNo,
3337
Long couponId
3438
) {
3539

40+
Map<Long, Integer> stockMap = products.stream()
41+
.collect(Collectors.toMap(Product::getId, Product::getStock));
42+
3643
List<OrderItemInfo> itemInfos = orderItems.stream()
37-
.map(item -> new OrderItemInfo(item.getProductId(), item.getQuantity()))
38-
.toList();
44+
.map(item -> new OrderItemInfo(
45+
item.getProductId(),
46+
item.getQuantity(),
47+
stockMap.getOrDefault(item.getProductId(), 0)
48+
)).toList();
3949

4050
return new OrderCreatedEvent(
4151
UUID.randomUUID().toString(),

apps/commerce-api/src/main/java/com/loopers/application/order/event/OrderSalesAggregateListener.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
@RequiredArgsConstructor
1515
public class OrderSalesAggregateListener {
1616

17-
private final ProductService productService;
1817
private final OutboxService outboxService;
1918
private final ApplicationEventPublisher eventPublisher;
2019

@@ -24,11 +23,10 @@ public void handleOrderCreated(OrderCreatedEvent event) {
2423

2524
event.items().forEach(item -> {
2625

27-
int currentStock = productService.getStock(item.productId());
2826
ProductStockEvent kafkaEvent = ProductStockEvent.of(
2927
item.productId(),
3028
item.quantity(),
31-
currentStock
29+
item.remainStock()
3230
);
3331

3432
outboxService.saveEvent("STOCKS_METRICS", String.valueOf(item.productId()), kafkaEvent);

0 commit comments

Comments
 (0)