💣 문제 상황


<aside> 📌

Redis를 활용하여 객실 선점 기능을 개발 (초기 로직)

</aside>

  1. 재고 확인 및 검증: Redis에서 각 날짜별 객실 재고를 조회하고, 1개 차감 후 값이 0 이상인지 확인한다.
  2. 재고 차감: 검증을 통과한 날짜에 대해 Redis에서 재고를 차감한다.
  3. 결과 반환: 모든 날짜의 차감이 성공하면 true, 실패하면 false를 반환한다.
@Configuration
@EnableTransactionManagement
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Long> inventoryRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Long> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        template.setKeySerializer(RedisSerializer.string());
        template.setValueSerializer(new GenericToStringSerializer<>(Long.class));
        template.setEnableTransactionSupport(true);
        return template;
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        return new JpaTransactionManager();
    }
}

@Override
**@Transactional**
public boolean decreaseRoomCount(InventoryQuery query) {
    ValueOperations<String, Integer> ops = redisTemplate.opsForValue();

		// 재고 확인 및 검증
    for (LocalDate date : query.getDateRange()) {
        String key = InventoryVo.from(query.hotelId(), date, query.roomType()).key();
        if (ops.get(key) - 1 < 0) {
            return false;
        }
    }
		
		// 재고 차감
    query.getDateRange().forEach(date -> {
        String key = InventoryVo.from(query.hotelId(), date, query.roomType()).key();
        ops.decrement(key);
    });

		// 결과 반환
    return true;
}

<aside> ⚙

15명1개만 남은 동일한 객실를 동시에 예약 테스트

</aside>

기대 1명만 예약 성공을 하고 나머지 14명은 객실 선점 실패로 인한 해당 객실을 선점하지 못했습니다 메세지 응답
실제 - 1명만 예약 성공(이는 확정 단계에서의 낙관적락 버전충돌 동시성 처리)

즉, 객실 선점 방식을 통해 동시성 문제를 해결하려 했으나 실패하였다.