JPA Dirty Check
public OrderResponse createOrder(OrderCreateRequest request, LocalDateTime registered) {
List<String> productNumbers = request.getProductNumbers();
List<Product> products = findProductsBy(productNumbers);
// 재고 차감 체크가 필요한 상품들 filter
List<String> stockProductNumbers = products.stream()
.filter(product -> ProductType.containStockType(product.getType()))
.map(Product::getProductNumber)
.collect(Collectors.toList());
// 재고 엔티티 조회
List<Stock> stocks = stockRepository.findAllByProductNumberIn(stockProductNumbers);
Map<String, Stock> stockMap = stocks.stream()
.collect(Collectors.toMap(Stock::getProductNumber, s -> s));
// 상품별 couting
Map<String, Long> productCountingMap = stockProductNumbers.stream()
.collect(Collectors.groupingBy(p -> p, Collectors.counting()));
// 재고 차감 시도
for(Stock stock : stockMap.values()) {
int quantity = productCountingMap.get(stock.getProductNumber()).intValue();
if(stock.isQuantityLessThan(quantity)){
throw new IllegalArgumentException("재고가 부족한 상품이 있습니다.");
}
stock.deductQuantity(quantity);
// stockRepository.save(stock);
}
Order order = Order.create(products,registered);
Order savedOrder = orderRepository.save(order);
// 저장이 된 후에야 Order에 id값 부여됨
return OrderResponse.of(savedOrder);
}조건
설명
🔸 Dirty Checking과 merge()의 차이
merge()의 차이🔸 변경 감지가 적용되지 않는 경우
Last updated