diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/waiting/redis/WaitingIdempotencyRepository.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/waiting/redis/WaitingIdempotencyRepository.java index 505e158..2d191f2 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/waiting/redis/WaitingIdempotencyRepository.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/waiting/redis/WaitingIdempotencyRepository.java @@ -85,4 +85,8 @@ public void saveIdempotencyInProgress(String key) { throw new IllegalArgumentException("Failed to serialize value for Redis", e); } } + + public void deleteByRegisterKey(String key) { + redisTemplate.delete(key); + } } diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/waiting/service/IdempotencyService.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/waiting/service/IdempotencyService.java index 7c039bf..039d6bb 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/waiting/service/IdempotencyService.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/waiting/service/IdempotencyService.java @@ -48,4 +48,11 @@ public void saveIdempotencyKeyInProgress(String idempotentKey) { } } + public void rollbackIdempotencyKey(String idempotentKey) { + if (idempotentKey != null && !idempotentKey.isBlank()) { + log.info("Rolling back idempotency key: {}", idempotentKey); + waitingIdempotencyRepository.deleteByRegisterKey(idempotentKey); + } + } + } diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/waiting/service/WaitingService.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/waiting/service/WaitingService.java index e517ce2..37cdbcd 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/waiting/service/WaitingService.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/waiting/service/WaitingService.java @@ -142,13 +142,20 @@ public CancelWaitingResponse cancelWaiting(CustomOAuth2User oAuth2User, String p .orElseThrow(UserNotFoundException::new); // DB 웨이팅 상태 취소 처리 - Reservation reservation = reservationRepository.findReservationByReservationNumber(request.getWaitingNumber()) - .orElseThrow(ReservationNotFoundException::new); - - reservation.markAsCancelled(LocalDateTime.now()); - - // Redis 대기열 취소 이벤트 발행 - waitingRedisRepository.removeWaiting(storeId, user.getId()); + Reservation reservation; + try { + reservation = reservationRepository.findReservationByReservationNumber(request.getWaitingNumber()) + .orElseThrow(ReservationNotFoundException::new); + + reservation.markAsCancelled(LocalDateTime.now()); + + // Redis 대기열 취소 이벤트 발행 + waitingRedisRepository.removeWaiting(storeId, user.getId()); + } catch (RuntimeException e) { + // 롤백 처리 + idempotencyService.rollbackIdempotencyKey(httpServletRequest.getHeader("Idempotency-Key")); + throw e; + } CancelWaitingResponse response = CancelWaitingResponse.builder() .waitingNumber(reservation.getReservationNumber())