인프런 커뮤니티 질문&답변

qheogus55님의 프로필 이미지
qheogus55

작성한 질문수

재고시스템으로 알아보는 동시성이슈 해결방법

Optimistic Lock 활용해보기

안녕하세요! 강사님 예외처리에 대한 질문이 있습니다.

작성

·

237

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);
    }
}
  1. stock 클래스에서 예외처리를 하는것이 좋을지 서비스 클래스에서 예외처리를 좋을지?!

  2. 예외를 주고 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("이미 품절된 상품입니다.");
    }

답변 2

1

최상용님의 프로필 이미지
최상용
지식공유자

qheogus55 님 안녕하세요!
좋은 질문 감사합니다!
보통은 재시도를 하지 않아도 되는 예외클래스를 만든 후 재고가 부족할 때 해당 예외를 throw 합니다.
그리고 while 문 안에서 해당 에러가 발생하였을 때는 재시도를 하지 않는 방식으로 해결할 수 있을 것 같습니다.

감사합니다.

0

qheogus55님의 프로필 이미지
qheogus55
질문자

답변 감사합니다 !!!!!!!!!!

qheogus55님의 프로필 이미지
qheogus55

작성한 질문수

질문하기