diff --git a/src/main/java/com/threestar/trainus/domain/payment/repository/PaymentRepository.java b/src/main/java/com/threestar/trainus/domain/payment/repository/PaymentRepository.java index d4b459e..0a083e7 100644 --- a/src/main/java/com/threestar/trainus/domain/payment/repository/PaymentRepository.java +++ b/src/main/java/com/threestar/trainus/domain/payment/repository/PaymentRepository.java @@ -35,10 +35,23 @@ List findPaymentIdsByUserAndStatus( @Param("limit") int limit ); + @Query(value = """ + SELECT p.id FROM payments p + WHERE p.user_id = :userId + AND p.status = :status + ORDER BY p.cancelled_at DESC + LIMIT :limit OFFSET :offset + """, nativeQuery = true) + List findCancelledPaymentIdsByUserAndStatus( + @Param("userId") Long userId, + @Param("status") String status, + @Param("offset") int offset, + @Param("limit") int limit + ); + @Query(""" SELECT p FROM Payment p LEFT JOIN FETCH p.lesson - LEFT JOIN FETCH p.userCoupon WHERE p.id IN :ids """) List findAllWithAssociationsByIds(@Param("ids") List ids); diff --git a/src/main/java/com/threestar/trainus/domain/payment/repository/TossPaymentRepository.java b/src/main/java/com/threestar/trainus/domain/payment/repository/TossPaymentRepository.java index 09a6f64..283d421 100644 --- a/src/main/java/com/threestar/trainus/domain/payment/repository/TossPaymentRepository.java +++ b/src/main/java/com/threestar/trainus/domain/payment/repository/TossPaymentRepository.java @@ -1,12 +1,21 @@ package com.threestar.trainus.domain.payment.repository; +import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import com.threestar.trainus.domain.payment.entity.TossPayment; public interface TossPaymentRepository extends JpaRepository { Optional findByOrderId(String orderId); + + @Query(""" + SELECT t FROM TossPayment t + WHERE t.orderId IN :orderIds + """) + List findAllByOrderIds(@Param("orderIds") List orderIds); } diff --git a/src/main/java/com/threestar/trainus/domain/payment/service/PaymentService.java b/src/main/java/com/threestar/trainus/domain/payment/service/PaymentService.java index 865ab28..7261fbd 100644 --- a/src/main/java/com/threestar/trainus/domain/payment/service/PaymentService.java +++ b/src/main/java/com/threestar/trainus/domain/payment/service/PaymentService.java @@ -203,10 +203,20 @@ public PaymentSuccessHistoryPageDto viewAllSuccessTransaction(Long userId, int p .map(map::get) .toList(); + List orderIds = allSuccessPayments.stream() + .map(Payment::getOrderId) + .toList(); + + Map tossPaymentMap = tossPaymentRepository.findAllByOrderIds(orderIds) + .stream() + .collect(Collectors.toMap(TossPayment::getOrderId, t -> t)); + List dtoList = allSuccessPayments.stream() .map(payment -> { - TossPayment tossPayment = tossPaymentRepository.findByOrderId(payment.getOrderId()) - .orElseThrow(() -> new BusinessException(ErrorCode.INVALID_PAYMENT)); + TossPayment tossPayment = tossPaymentMap.get(payment.getOrderId()); + if (tossPayment == null) { + throw new BusinessException(ErrorCode.INVALID_PAYMENT); + } return PaymentMapper.toPaymentSuccessHistoryResponseDto(payment, tossPayment); }) .toList(); @@ -219,7 +229,7 @@ public PaymentSuccessHistoryPageDto viewAllSuccessTransaction(Long userId, int p @Transactional(readOnly = true) public PaymentCancelHistoryPageDto viewAllFailureTransaction(Long userId, int page, int pageSize) { - List paymentIds = paymentRepository.findPaymentIdsByUserAndStatus(userId, + List paymentIds = paymentRepository.findCancelledPaymentIdsByUserAndStatus(userId, PaymentStatus.CANCELED.name(), (page - 1) * pageSize, pageSize); if (paymentIds.isEmpty()) { @@ -233,10 +243,20 @@ public PaymentCancelHistoryPageDto viewAllFailureTransaction(Long userId, int pa .map(map::get) .toList(); + List orderIds = allFailurePayments.stream() + .map(Payment::getOrderId) + .toList(); + + Map tossPaymentMap = tossPaymentRepository.findAllByOrderIds(orderIds) + .stream() + .collect(Collectors.toMap(TossPayment::getOrderId, t -> t)); + List dtoList = allFailurePayments.stream() .map(payment -> { - TossPayment tossPayment = tossPaymentRepository.findByOrderId(payment.getOrderId()) - .orElseThrow(() -> new BusinessException(ErrorCode.INVALID_PAYMENT)); + TossPayment tossPayment = tossPaymentMap.get(payment.getOrderId()); + if (tossPayment == null) { + throw new BusinessException(ErrorCode.INVALID_PAYMENT); + } return PaymentMapper.toPaymentFailureHistoryResponseDto(payment, tossPayment); }) .toList();