본문 바로가기
카테고리 없음

삽질 ep.3 (feat. Transactional)

by 수수남매 2023. 11. 22.
  • 주문 서비스 중에 주문을 완료하고 받은 포인트를 사장 계정에 넣는 API를 구현
  • @Transactional을 걸어놨으니 주문은 주문대로 계정은 계정대로 알아서 Dirty checking할 것이라고 생각했으나..
@Transactional
public void completeOrders(Account owner, Long accountId) {
    List<Order> orders = orderRepository.findAllByAccountId(accountId);
    int totalPrice = 0;
    for (Order order : orders) {
        checkOrderStatus(order).complete();
        totalPrice += order.getMenu().getPrice() * order.getQuantity();
    }
    owner.earnPoint(totalPrice);
}
  • 사장은 돈(포인트)를 받지 못하였다..
  • 다시 가만히 보니 사장은 아직 영속화되지 않은 상태였다.
  • 부랴부랴 영속화를 시켜주고 해결
@Transactional
public void completeOrders(Account owner, Long accountId) {
    List<Order> orders = orderRepository.findAllByAccountId(accountId);
    int totalPrice = 0;
    for (Order order : orders) {
        checkOrderStatus(order).complete();
        totalPrice += order.getMenu().getPrice() * order.getQuantity();
    }
    owner.earnPoint(totalPrice);
    accountRepository.save(owner); // 일단 불러줘야 Dirty한지 알 것 아닌가!
}