inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

Optimistic Lock 활용해보기

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

366

qheogus55

작성한 질문수 42

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("이미 품절된 상품입니다.");
    }

java spring 동시성

답변 2

1

최상용

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

감사합니다.

0

qheogus55

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

레디선 테스트코드에서 채널이름은 없어도 되는건가요?

0

43

2

낙관적 락을 사용할 떄 차이점

0

119

2

동시성 검증 코드에 관한 문의

0

94

2

단일연산

0

70

2

낙관적락vs. 레디스락

0

108

2

안녕하세요. 레디슨 질문있습니다..!!

0

67

2

@Lock(OPTIMISTIC)이 필요한 이유

0

90

2

get_lock 의 timeout이 3000초 이던데 너무 긴거 아닌가요?

0

131

2

DataSource Hikari 사용 이유

0

145

2

saveAndFlush 사용 이유 문의

0

112

3

비관적 락 VS 네임드 락

0

159

3

application.yaml 에 redis 정보

0

99

2

왜 클래스 이름에 Facade 가 붙나요?

0

183

2

@Transactional 으로 인한 동시성 문제 발생 원인이 궁금합니다.

0

219

2

@modifying 이용한 동시성 제어

0

168

2

DB락과 분산락

0

260

2

NamedLock 테스트 실패

0

186

2

테스트에서 트랜잭션 어노테이션 질문 있습니다.

0

172

2

optimistic Lock 재시도 질문입니다.

0

230

2

낙관적 락 테스트 실패

0

239

2

오류?

0

1626

4

LettureLockStockFacadeTest에서 오류가 발생합니다.

1

268

2

Pessimistic Lock 전체 테스트 오류 문의

0

359

3

비관적 락 vs 레디스(Lettuce)락 비교 관련 질문

0

460

2