24.02.29 02:26 작성
·
234
0
현재 강의에서는 정상적인 코드면 무한루프가 종료되는걸로 생각하고 있습니다.하지만1. 재고가 감소시켜야 하는 수량 보다 적을 경우는 무한루프를 도는것을 확인했습니다.어떻게 예외처리를 해야할 지 잘 모르겠어서 질문드립니다 ㅠ
public class Stock {
// ...
public void decrease(Long quantity) {
if (this.quantity - quantity < 0) {
throw new RuntimeException("재고 수량이 부족합니다.");
}
this.quantity -= quantity;
}
}
public class OptimisticLockService {
private final StockRepository stockRepository;
@Transactional
public void decrease(Long id,Long quantity){
Stock stock = stockRepository.findByIdWithOptimisticLock(id);
if (stock.getQuantity() < quantity) {
throw new RuntimeException("재고 수량이 부족합니다.");
}
stock.decrease(quantity);
}
}
stock 클래스에서 예외처리를 하는것이 좋을지 서비스 클래스에서 예외처리를 좋을지?!
예외를 주고 OptimisticLockStockFacade에 대한 무한루프를 어떻게 처리할지..
강의 잘 들었습니다 답변 부탁드려용 ..
@Component
@RequiredArgsConstructor
public class OptimisticLockStockFacade {
private final OptimisticLockService optimisticLockService;
public void decrease(Long id, Long quantity) throws InterruptedException {
while (true) {
try {
optimisticLockService.decrease(id, quantity);
break;
}catch(Exception e) {
Thread.sleep(50);
}
}
}
}
현재 아래코드를 실행하면 무한루프가 나갑니다.!
@Test
@DisplayName("재고가 없을시 재고감소 로직 요청시 예외가 일어난다.")
void decreaseStockZero() {
//given
//when
//then
assertThatThrownBy(() -> optimisticLockStockFacade.decrease(1L, 101L))
.isInstanceOf(RuntimeException.class)
.hasMessage("이미 품절된 상품입니다.");
}