MgtService에서 enter 메서드를 실행해 입차를 진행 할 수 있습니다. 입차된 차량은 ParkMgtInfo 엔티티에 객체가 save되고, 그렇게 save된 객체를 프론트에서 보여주게 됩니다.

입차 관련 동시성 테스트를 하기 위해 여러 스레드들을 동시에 실행시켜 주차장에 차량들이 정상적으로 들어가는지( 주차장 자리가 30자리인데 50개의 스레드가 동시에 enter 메서드를 실행해도 30대의 차량만 입차) 확인 하고자 합니다.

ParkNav2/MgtService.java at develop · final-project-teamB/ParkNav2

위 깃허브 링크는 enter로직이 있는 service입니다.

// When
        log.info("enter 동시성 테스트 진행");

        for (CarNumRequestDto vehicleId : vehicleIds) {
            executorService.execute(() -> {
                try {
                    mgtService.enter(vehicleId, admin);
                    successCount.getAndIncrement();
                    log.info("입차 성공");
                    log.info("차량 아이디 : {}", vehicleId.getCarNum());
                } catch (CustomException e) {
                    failCount.getAndIncrement();
                    log.info("주차장 자리가 꽉찼습니다.");
                }
                endLatch.countDown();
                log.info("parkMgtInfoRepository : {}",parkMgtInfoRepository.findAllByParkInfoId(1L).size());
            });
        }

        // Then
        log.info("enter 동시성 테스트 결과 검증");

        endLatch.await();
        Assertions.assertEquals(cmptrCo, successCount.get());
        Assertions.assertEquals(numOfUsers - cmptrCo, failCount.get());

위 코드는 동시성 제어 테스트 코드의 when, then 부분입니다.

문제 상황

  1. Redis DB에 lock 저장이 안되는 상황

redisRepository에 있는 lock() 메서드를 통해 특정 데이터의 락을 획득해 redis에 저장을 해야합니다. 하지만 실제 테스트를 돌려보니 redis에 lock 데이터가 존재하지 않았습니다.

Untitled

                                                   정상적으로 redis에 저장

Untitled

Intellij의 로그에선 락 획득 성공은 찍히지만 redis 로그에는 아무런 로그도 찍히지 않습니다.

  1. 주차장에 입차시 db에 저장이 불가능
List<ParkMgtInfo> parkMgtInfo = parkMgtInfoRepository.findAllByParkInfoId(requestDto.getParkId());

// 주차 구획수
int cmprtCoNum = parkInfo.getParkOperInfo().getCmprtCo();
// 이 주차장에 현재 입차되어있는 차량 수
int mgtNum = getMgtNum(parkMgtInfo);
if (bookingNowCnt + mgtNum >= cmprtCoNum) {
    throw new CustomException(ErrorType.NOT_PARKING_SPACE);
}

위 코드는 enter 로직의 일부입니다. db에 데이터를 저장시켜야 하는데, Mock 객체를 이용함으로써 객체가 저장되지 않고, 그로인해 db에서 데이터를 불러올 수 없고, 총 입차한 차량 댓수를 구할 수 없습니다. 총 입차한 차량을 알아야 테스트 코드에서 CustomException을 catch 할 수 있습니다.