-
카테고리
-
세부 분야
백엔드
-
해결 여부
미해결
안녕하세요! 강사님 예외처리에 대한 질문이 있습니다.
24.02.29 02:26 작성 조회수 146
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("이미 품절된 상품입니다.");
}
답변을 작성해보세요.
1
최상용
지식공유자2024.03.01
qheogus55 님 안녕하세요!
좋은 질문 감사합니다!
보통은 재시도를 하지 않아도 되는 예외클래스를 만든 후 재고가 부족할 때 해당 예외를 throw 합니다.
그리고 while 문 안에서 해당 에러가 발생하였을 때는 재시도를 하지 않는 방식으로 해결할 수 있을 것 같습니다.
감사합니다.
0
답변 2