<aside> 📌
Redis를 활용하여 객실 선점 기능을 개발 (초기 로직)
</aside>
true
, 실패하면 false
를 반환한다.decrement()
호출 시 음수가 반환되어 객실 선점에 실패한 경우, 추후 롤백으로 인한 보상 트랜잭션에서 재고 값을 정확히 복구하기 위해 보정하는 작업(increment()
)이 필요@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명만 예약 성공(이는 확정 단계에서의 낙관적락 버전충돌 동시성 처리) |
예약 확정 중 오류가 발생했습니다
메세지 응답 |즉, 객실 선점 방식을 통해 동시성 문제를 해결하려 했으나 실패하였다.