들어가기 앞서..

<aside> 📄

동시성 테스트 과정에서 발생한 트러블 슈팅입니다.

</aside>

분명 redis lock을 통해서 동시성을 보장해주었다고 생각했는데, 이벤트 누적 금액이 정상적으로 반영되지 않는 결과가 있었다. 왜 동시성이 제대로 보장되지 않았을까? 오류를 해결해보자.

문제 상황

필자의 서비스는 이벤트에 응모할 시, 사용자의 포인트를 차감하여 해당 포인트만큼 이벤트에 누적하게 된다.

하지만 10000개의 요청을 동시에 보냈을 때, 사용자의 포인트 1만큼 이벤트에 만 번이 누적되니 10000원이 누적되어야하는데 아래와 같이 이벤트 누적금액이 8,397원만 누적된 것을 확인할 수 있었다.

스크린샷 2025-09-08 오후 7.11.27.png

분명 동시성을 보장했다고 생각했는데 왜 제대로 값이 누적되지 않았을까?

문제를 파악하기 위해 각 스레드가 이벤트에 금액을 누적한 뒤의 누적 금액이 얼마인지 확인해보았다.

public void accumulate(Short perPrice) {
	if (!this.status.getId().equals(StatusIds.Event.IN_PROGRESS)) {
		throw  new BusinessException(ErrorCode.EVENT_NOT_IN_PROGRESS);
}
this.accrued += perPrice;
	System.out.println("스레드 : " + Thread.currentThread().getName() + "accrued = " + accrued);
}

스크린샷 2025-09-09 오전 9.59.30.png

스크린샷 2025-09-09 오전 9.59.04.png

분명 톰캣이 사용하는 스레드가 다른데 accrued는 둘다 11945원으로, 하나의 스레드가 값을 누적하지 못한 것으로 보인다.

해당 문제를 해결해보자.