From d20c593339fbce8ae5aa2cc48ea5e2b539ef76c7 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Mon, 23 Feb 2026 13:20:16 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=20ReservationNotFoundException=20?= =?UTF-8?q?=ED=84=B0=EC=A7=80=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20=EB=A9=B1?= =?UTF-8?q?=EB=93=B1=ED=82=A4=20=EB=A1=A4=EB=B0=B1=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../redis/WaitingIdempotencyRepository.java | 4 ++++ .../waiting/service/IdempotencyService.java | 7 +++++++ .../waiting/service/WaitingService.java | 21 ++++++++++++------- 3 files changed, 25 insertions(+), 7 deletions(-) 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())