From 8a24edc558ebbb447671f701b09b184af52d8a79 Mon Sep 17 00:00:00 2001 From: munyeong0103 Date: Tue, 6 Jan 2026 15:18:48 +0900 Subject: [PATCH 1/2] =?UTF-8?q?refactor:=20ordered=20=EC=83=81=ED=83=9C=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC(PENDING=5FPAYMENT,PAYMENT=5FFAILED)=20=20(#1?= =?UTF-8?q?67)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/payment/PaymentController.java | 2 +- src/main/java/com/kt/domain/order/Order.java | 4 +++- .../java/com/kt/domain/order/OrderStatus.java | 10 +++++----- .../com/kt/service/order/OrderService.java | 18 ++++++++++++++---- .../com/kt/service/payment/PaymentFacade.java | 12 ++++++++---- .../com/kt/service/order/OrderServiceTest.java | 1 - 6 files changed, 31 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/kt/controller/payment/PaymentController.java b/src/main/java/com/kt/controller/payment/PaymentController.java index ac33635d..612f4607 100644 --- a/src/main/java/com/kt/controller/payment/PaymentController.java +++ b/src/main/java/com/kt/controller/payment/PaymentController.java @@ -99,7 +99,7 @@ public ResponseEntity confirmPayment(@RequestBody PaymentTossConfirmRequest r String orderId = request.orderId().split("-")[0]; Long orderIdLong = Long.parseLong(orderId); var order = orderService.getOrderDetail(orderIdLong, currentUser.getId()); - if (order.orderStatus() != OrderStatus.ORDERED) { + if (order.orderStatus() != OrderStatus.PENDING_PAYMENT) { return ResponseEntity .status(HttpStatus.BAD_REQUEST) .body(Map.of( diff --git a/src/main/java/com/kt/domain/order/Order.java b/src/main/java/com/kt/domain/order/Order.java index 2fde59dd..2261ba51 100644 --- a/src/main/java/com/kt/domain/order/Order.java +++ b/src/main/java/com/kt/domain/order/Order.java @@ -52,7 +52,7 @@ public Order(String receiverName, String receiverPhone, String receiverAddress, this.receiverName = receiverName; this.receiverPhone = receiverPhone; this.receiverAddress = receiverAddress; - this.orderStatus = OrderStatus.ORDERED; + this.orderStatus = OrderStatus.PENDING_PAYMENT; this.isDeleted = false; this.user = user; @@ -85,6 +85,8 @@ public void approveReturn() { this.orderStatus = OrderStatus.RETURNED; } + public void failPayment() { this.orderStatus = OrderStatus.PAYMENT_FAILED; } + public void updateStatus(OrderStatus newStatus) { this.orderStatus = newStatus; diff --git a/src/main/java/com/kt/domain/order/OrderStatus.java b/src/main/java/com/kt/domain/order/OrderStatus.java index 3f6b3b54..607a2403 100644 --- a/src/main/java/com/kt/domain/order/OrderStatus.java +++ b/src/main/java/com/kt/domain/order/OrderStatus.java @@ -6,8 +6,11 @@ @Getter @RequiredArgsConstructor public enum OrderStatus { - ORDERED("주문 완료"), + // ORDERED("주문 완료"), + PENDING_PAYMENT("결제 대기"), + PAYMENT_FAILED("결제 실패"), PAID("결제 완료"), + PROCESSING("배송 전"), SHIPPED("배송 중"), DELIVERED("배송 완료"), @@ -16,10 +19,7 @@ public enum OrderStatus { RETURN_REQUESTED("반품 요청"), RETURNED("반품 완료"), REFUND_REQUESTED("환불 요청"), - REFUNDED("환불 완료"), - - PENDING_PAYMENT("결제 대기"), - PAYMENT_FAILED("결제 실패"); + REFUNDED("환불 완료"); private final String description; } diff --git a/src/main/java/com/kt/service/order/OrderService.java b/src/main/java/com/kt/service/order/OrderService.java index ae66582e..184de968 100644 --- a/src/main/java/com/kt/service/order/OrderService.java +++ b/src/main/java/com/kt/service/order/OrderService.java @@ -9,6 +9,7 @@ import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import com.kt.common.exception.CustomException; @@ -131,6 +132,12 @@ public void save(Long orderId){ order.updateStatus(OrderStatus.PAID); } + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void rollback(Long orderId){ + var order = orderRepository.findByIdOrThrow(orderId, ErrorCode.NOT_FOUND_ORDER); + order.failPayment(); + } + public Page getOrderList(Long userId, Paging paging) { Page orders = orderRepositoryCustom.getOrders(userId, paging.toPageable()); @@ -176,7 +183,8 @@ public void cancel(Long orderId, Long userId) { Preconditions.validate(order.getUser().getId().equals(userId), ErrorCode.NOT_ORDER_OWNER); // 주문 취소 가능 여부 검증 - Preconditions.validate(order.getOrderStatus() == OrderStatus.ORDERED || + Preconditions.validate(order.getOrderStatus() == OrderStatus.PENDING_PAYMENT || + order.getOrderStatus() == OrderStatus.PAYMENT_FAILED || order.getOrderStatus() == OrderStatus.PAID, ErrorCode.CANNOT_CANCEL_ORDER); order.cancel(); @@ -224,8 +232,9 @@ public void update(OrderUpdateRequest request, Long orderId, Long userId) { Preconditions.validate(order.getUser().getId().equals(userId), ErrorCode.NOT_ORDER_OWNER); - Preconditions.validate(order.getOrderStatus() == OrderStatus.ORDERED || - order.getOrderStatus() == OrderStatus.PAID, ErrorCode.CANNOT_UPDATE_ORDER_INFO); + Preconditions.validate(order.getOrderStatus() == OrderStatus.PENDING_PAYMENT || + order.getOrderStatus() == OrderStatus.PAID || + order.getOrderStatus() == OrderStatus.PAYMENT_FAILED , ErrorCode.CANNOT_UPDATE_ORDER_INFO); String updatedAddress = request.receiverAddressId() != null ? shoppingAddressRepository.findByIdAndUserIdOrThrow(request.receiverAddressId(), userId, ErrorCode.NOT_SHOPPING_ADDRESS_OWNER).getAddress() @@ -243,7 +252,8 @@ public void cancelByAdmin(Long orderId) { var order = orderRepository.findByIdOrThrow(orderId, ErrorCode.NOT_FOUND_ORDER); // 주문 취소 가능 여부 검증 - Preconditions.validate(order.getOrderStatus() == OrderStatus.ORDERED || + Preconditions.validate(order.getOrderStatus() == OrderStatus.PENDING_PAYMENT || + order.getOrderStatus() == OrderStatus.PAYMENT_FAILED || order.getOrderStatus() == OrderStatus.PAID, ErrorCode.CANNOT_CANCEL_ORDER); order.cancel(); diff --git a/src/main/java/com/kt/service/payment/PaymentFacade.java b/src/main/java/com/kt/service/payment/PaymentFacade.java index 828f3784..ce771a20 100644 --- a/src/main/java/com/kt/service/payment/PaymentFacade.java +++ b/src/main/java/com/kt/service/payment/PaymentFacade.java @@ -17,9 +17,13 @@ public class PaymentFacade { @Transactional public Long completePayment(Map tossResponse, Long userId, Long orderId) { - var paymentId = paymentService.create(tossResponse, userId); - orderService.save(orderId); - - return paymentId; + try { + var paymentId = paymentService.create(tossResponse, userId); + orderService.save(orderId); + return paymentId; + } catch (Exception e) { + orderService.rollback(orderId); + throw e; + } } } diff --git a/src/test/java/com/kt/service/order/OrderServiceTest.java b/src/test/java/com/kt/service/order/OrderServiceTest.java index e7517cd0..f7b82f84 100644 --- a/src/test/java/com/kt/service/order/OrderServiceTest.java +++ b/src/test/java/com/kt/service/order/OrderServiceTest.java @@ -274,7 +274,6 @@ void initOrderTestData() { OrderDetailResponse orderDetail = orderService.getOrderDetail(user.getId(), orderId); //then - assertThat(orderDetail.orderStatus()).isEqualTo(OrderStatus.ORDERED); assertThat(orderDetail.receiverName()).isEqualTo(user.getName()); assertThat(orderDetail.receiverPhone()).isEqualTo(user.getMobile()); assertThat(orderDetail.receiverAddress()).isEqualTo(savedAddress.getAddress()); From b9cffc4f2072b5793dfb0c80a496f7ef434c2a14 Mon Sep 17 00:00:00 2001 From: munyeong0103 Date: Tue, 6 Jan 2026 16:05:35 +0900 Subject: [PATCH 2/2] =?UTF-8?q?refactor:=20=ED=8C=8C=EB=9D=BC=EB=AF=B8?= =?UTF-8?q?=ED=84=B0=20=EC=88=9C=EC=84=9C=20=EC=A0=95=EB=A6=AC=20=20(#167)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/kt/controller/payment/PaymentController.java | 9 +++++---- src/main/java/com/kt/service/payment/PaymentFacade.java | 2 +- src/main/java/com/kt/service/payment/PaymentService.java | 6 ++---- .../java/com/kt/service/payment/PaymentServiceTest.java | 4 ++-- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/kt/controller/payment/PaymentController.java b/src/main/java/com/kt/controller/payment/PaymentController.java index 612f4607..d0cc6273 100644 --- a/src/main/java/com/kt/controller/payment/PaymentController.java +++ b/src/main/java/com/kt/controller/payment/PaymentController.java @@ -91,14 +91,15 @@ public ApiResult create(@Valid @RequestBody PaymentCreateRequest request, public ResponseEntity confirmPayment(@RequestBody PaymentTossConfirmRequest request, @AuthenticationPrincipal CustomUserDetails currentUser ) { + String orderId = request.orderId().split("-")[0]; + Long orderIdLong = Long.parseLong(orderId); + try { String url = tossPaymentsProperties.getApiUrl() + "/confirm"; String auth = tossPaymentsProperties.getSecretKey() + ":"; String encodedAuth = java.util.Base64.getEncoder().encodeToString(auth.getBytes(StandardCharsets.UTF_8)); - String orderId = request.orderId().split("-")[0]; - Long orderIdLong = Long.parseLong(orderId); - var order = orderService.getOrderDetail(orderIdLong, currentUser.getId()); + var order = orderService.getOrderDetail(currentUser.getId(), orderIdLong); if (order.orderStatus() != OrderStatus.PENDING_PAYMENT) { return ResponseEntity .status(HttpStatus.BAD_REQUEST) @@ -141,7 +142,7 @@ public ResponseEntity confirmPayment(@RequestBody PaymentTossConfirmRequest r } catch (Exception e) { e.printStackTrace(); - //TODO order 생성 기록 rollback + orderService.rollback(orderIdLong); return ResponseEntity .status(HttpStatus.INTERNAL_SERVER_ERROR) .body(Map.of( diff --git a/src/main/java/com/kt/service/payment/PaymentFacade.java b/src/main/java/com/kt/service/payment/PaymentFacade.java index ce771a20..717f2508 100644 --- a/src/main/java/com/kt/service/payment/PaymentFacade.java +++ b/src/main/java/com/kt/service/payment/PaymentFacade.java @@ -18,7 +18,7 @@ public class PaymentFacade { @Transactional public Long completePayment(Map tossResponse, Long userId, Long orderId) { try { - var paymentId = paymentService.create(tossResponse, userId); + var paymentId = paymentService.create(tossResponse, userId, orderId); orderService.save(orderId); return paymentId; } catch (Exception e) { diff --git a/src/main/java/com/kt/service/payment/PaymentService.java b/src/main/java/com/kt/service/payment/PaymentService.java index 31f0eb8e..64b1432b 100644 --- a/src/main/java/com/kt/service/payment/PaymentService.java +++ b/src/main/java/com/kt/service/payment/PaymentService.java @@ -51,10 +51,8 @@ public class PaymentService { private final OrderRepositoryCustom orderRepositoryCustom; private final OrderProductRepositoryCustom orderProductRepositoryCustom; - public Long create(Map tossResponse, Long userId) { - String orderId = tossResponse.get("orderId").toString().split("-")[0]; - - var order = orderRepository.findByIdAndUserIdOrThrow(Long.parseLong(orderId), userId, ErrorCode.NOT_FOUND_ORDER); + public Long create(Map tossResponse, Long userId, Long orderId) { + var order = orderRepository.findByIdAndUserIdOrThrow(orderId, userId, ErrorCode.NOT_FOUND_ORDER); var paymentType = paymentTypeRepository.findByName(tossResponse.get("method").toString()).orElseThrow(); diff --git a/src/test/java/com/kt/service/payment/PaymentServiceTest.java b/src/test/java/com/kt/service/payment/PaymentServiceTest.java index d4d25200..c4782d97 100644 --- a/src/test/java/com/kt/service/payment/PaymentServiceTest.java +++ b/src/test/java/com/kt/service/payment/PaymentServiceTest.java @@ -108,7 +108,7 @@ void setUp() { @Test void 주문에_대한_결제_생성_가능() { - paymentService.create(토스_결제_응답(), user.getId()); + paymentService.create(토스_결제_응답(), user.getId(), order.getId()); Payment payment = paymentRepository.findAll().get(0); @@ -133,7 +133,7 @@ void setUp() { new DiscountMembership(membershipDiscount, membership) ); - paymentService.create(토스_결제_응답(), user.getId()); + paymentService.create(토스_결제_응답(), user.getId(), order.getId()); Payment payment = paymentRepository.findAll().get(0);