작성
·
462
·
수정됨
0
StockService.decrease 메소드의 경우
synchronized 가 붙어있어서 하나의 쓰레드만 들어갈 수 있도록 도와주지만,
@Transactional 이 붙어있기에 froxy 객체로 만들어서 동시성이 안됨을 아래 테스트코드로 확인하였습니다.
하지만 똑같은 StockService.decrease를 사용하여
CompletableFuture.runAsync를 사용하면 동시성이 보장이됩니다..
똑같이 @Transactional을 사용한 decrease메소드라서 froxy객체로 만들어져서 동시성이 보장 안될것이라 예측했는데 왜 CompletableFuture.runAsync는 동시성 보장이 될까 궁금합니다ㅠㅠ
답변 1
0
김금빛님 안녕하세요.
CompletableFuture 를 이용하여 작성해주신 테스트코드가 의도대로 동작하지 않는 이유는 다음과 같습니다.
1. runAsync 안에 아래와 같은 구문이 존재하며 이 구문은 비동기로 실행되는것이 아니라 재고수량을 감소하면 그 다음에 다음요청을 보내게 됩니다.
그렇기에 동시에 100개를 요청하는 것이 아닌 100개의 요청이 순차적으로 요청되게 됩니다.
for (int i=0; i<100;i++) {
stockService.decrease(2L, 1L);
}
작업이 모두 종료되기 이전에 테스트 케이스가 종료됩니다.
stockService.decrease 구문을 동시에 요청을 하게 되더라다도 작업이 모두 종료되기 이전에 테스트케이스가 종료되기때문에 성공하는것처럼 보이는 문제가 있습니다.
이를 기다리기 위하여 CountDownLatch 를 사용하시면 좋을 것 같습니다.
감사합니다 :)