Skip to content

Commit 86fe7fe

Browse files
authored
feat: ticket-order 1대1 비즈니스로직 무결성 보장 로직 추가
* feat: ticket-order 1대1 비즈니스로직 무결성 보장 로직 추가 * chore:
1 parent e9e83dd commit 86fe7fe

2 files changed

Lines changed: 19 additions & 0 deletions

File tree

backend/src/main/java/com/back/api/payment/order/service/OrderService.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.back.api.payment.order.service;
22

3+
import java.util.Optional;
34
import java.util.Random;
45
import java.util.UUID;
56

@@ -18,9 +19,11 @@
1819
import com.back.global.error.exception.ErrorException;
1920

2021
import lombok.RequiredArgsConstructor;
22+
import lombok.extern.slf4j.Slf4j;
2123

2224
@Service
2325
@RequiredArgsConstructor
26+
@Slf4j
2427
public class OrderService {
2528
private final OrderRepository orderRepository;
2629
private final TicketService ticketService;
@@ -35,6 +38,19 @@ public OrderResponseDto createOrder(OrderRequestDto orderRequestDto, Long userId
3538
// 티켓이 DRAFT 상태인지 확인
3639
Ticket draft = ticketService.getDraftTicket(orderRequestDto.eventId(), orderRequestDto.seatId(), userId);
3740

41+
// 이미 PENDING 상태의 Order가 있는지 확인
42+
// 다중 요청 방어 로직
43+
Optional<Order> existingOrder = orderRepository.findByTicketIdAndStatus(
44+
draft.getId(),
45+
OrderStatus.PENDING
46+
);
47+
48+
if (existingOrder.isPresent()) {
49+
// 기존 Order 재사용 (새로 만들지 않음)
50+
log.info("Duplicate order request, reusing existing orderId={}", existingOrder.get().getId());
51+
return OrderResponseDto.from(existingOrder.get(), draft);
52+
}
53+
3854
// 금액 일치 여부 확인
3955
Integer actualAmount = draft.getSeat().getPrice();
4056
if (!orderRequestDto.amount().equals(actualAmount.longValue())) {

backend/src/main/java/com/back/domain/payment/order/repository/OrderRepository.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.springframework.stereotype.Repository;
99

1010
import com.back.domain.payment.order.entity.Order;
11+
import com.back.domain.payment.order.entity.OrderStatus;
1112

1213
@Repository
1314
public interface OrderRepository extends JpaRepository<Order, Long> {
@@ -20,4 +21,6 @@ public interface OrderRepository extends JpaRepository<Order, Long> {
2021
WHERE o.id = :orderId
2122
""")
2223
Optional<Order> findByIdWithDetails(@Param("orderId") Long orderId);
24+
25+
Optional<Order> findByTicketIdAndStatus(Long ticketId, OrderStatus orderStatus);
2326
}

0 commit comments

Comments
 (0)