diff --git a/src/main/java/com/clova/anifriends/domain/payment/repository/PaymentRepository.java b/src/main/java/com/clova/anifriends/domain/payment/repository/PaymentRepository.java index f81bb168..33eb0973 100644 --- a/src/main/java/com/clova/anifriends/domain/payment/repository/PaymentRepository.java +++ b/src/main/java/com/clova/anifriends/domain/payment/repository/PaymentRepository.java @@ -1,10 +1,32 @@ package com.clova.anifriends.domain.payment.repository; import com.clova.anifriends.domain.payment.Payment; +import com.clova.anifriends.domain.payment.vo.PaymentStatus; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.transaction.annotation.Transactional; public interface PaymentRepository extends JpaRepository { Optional findByOrderId(String orderId); + + @Modifying + @Transactional + @Query("update Payment p set p.status = :status where p.paymentId = :paymentId") + void updatePaymentStatus( + @Param("paymentId") Long paymentId, + @Param("status") PaymentStatus status + ); + + @Modifying + @Transactional + @Query("update Payment p set p.paymentKey = :paymentKey, p.status = :status where p.paymentId = :paymentId") + void updatePaymentKeyAndStatus( + @Param("paymentId") Long paymentId, + @Param("paymentKey") String paymentKey, + @Param("status") PaymentStatus status + ); } diff --git a/src/main/java/com/clova/anifriends/domain/payment/service/PaymentService.java b/src/main/java/com/clova/anifriends/domain/payment/service/PaymentService.java index de686471..7b3010f8 100644 --- a/src/main/java/com/clova/anifriends/domain/payment/service/PaymentService.java +++ b/src/main/java/com/clova/anifriends/domain/payment/service/PaymentService.java @@ -1,5 +1,8 @@ package com.clova.anifriends.domain.payment.service; +import static com.clova.anifriends.domain.payment.vo.PaymentStatus.ABORTED; +import static com.clova.anifriends.domain.payment.vo.PaymentStatus.DONE; + import com.clova.anifriends.domain.payment.Payment; import com.clova.anifriends.domain.payment.dto.response.PaymentResponse; import com.clova.anifriends.domain.payment.exception.PaymentBadRequestException; @@ -18,7 +21,6 @@ public class PaymentService { private final PaymentRepository paymentRepository; private final PaymentClient paymentClient; - @Transactional(noRollbackFor = {PaymentFailException.class, ExternalApiException.class}) public PaymentResponse paySuccess(String orderId, String paymentKey, Integer amount) { Payment payment = getPayment(orderId); validatePaymentStatus(payment); @@ -27,14 +29,13 @@ public PaymentResponse paySuccess(String orderId, String paymentKey, Integer amo try { paymentClient.confirmPayment(orderId, paymentKey, amount); } catch (PaymentFailException | ExternalApiException exception) { - payment.fail(); + paymentRepository.updatePaymentStatus(payment.getPaymentId(), ABORTED); throw exception; } - payment.updatePaymentKey(paymentKey); - payment.success(); + paymentRepository.updatePaymentKeyAndStatus(payment.getPaymentId(), paymentKey, DONE); - return new PaymentResponse(payment.getStatus(), null); + return new PaymentResponse(DONE, null); } @Transactional diff --git a/src/test/java/com/clova/anifriends/base/BaseRepositoryTest.java b/src/test/java/com/clova/anifriends/base/BaseRepositoryTest.java index a0d40ef0..204769a8 100644 --- a/src/test/java/com/clova/anifriends/base/BaseRepositoryTest.java +++ b/src/test/java/com/clova/anifriends/base/BaseRepositoryTest.java @@ -5,8 +5,10 @@ import com.clova.anifriends.domain.applicant.repository.ApplicantRepository; import com.clova.anifriends.domain.chat.repository.ChatMessageRepository; import com.clova.anifriends.domain.chat.repository.ChatRoomRepository; +import com.clova.anifriends.domain.donation.repository.DonationRepository; import com.clova.anifriends.domain.notification.repository.ShelterNotificationRepository; import com.clova.anifriends.domain.notification.repository.VolunteerNotificationRepository; +import com.clova.anifriends.domain.payment.repository.PaymentRepository; import com.clova.anifriends.domain.recruitment.repository.RecruitmentRepository; import com.clova.anifriends.domain.review.repository.ReviewRepository; import com.clova.anifriends.domain.shelter.repository.ShelterRepository; @@ -53,4 +55,10 @@ public abstract class BaseRepositoryTest { @Autowired protected VolunteerNotificationRepository volunteerNotificationRepository; + + @Autowired + protected PaymentRepository paymentRepository; + + @Autowired + protected DonationRepository donationRepository; } diff --git a/src/test/java/com/clova/anifriends/domain/payment/repository/PaymentRepositoryTest.java b/src/test/java/com/clova/anifriends/domain/payment/repository/PaymentRepositoryTest.java new file mode 100644 index 00000000..8f781c33 --- /dev/null +++ b/src/test/java/com/clova/anifriends/domain/payment/repository/PaymentRepositoryTest.java @@ -0,0 +1,49 @@ +package com.clova.anifriends.domain.payment.repository; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.clova.anifriends.base.BaseRepositoryTest; +import com.clova.anifriends.domain.donation.Donation; +import com.clova.anifriends.domain.donation.support.fixture.DonationFixture; +import com.clova.anifriends.domain.payment.Payment; +import com.clova.anifriends.domain.payment.vo.PaymentStatus; +import com.clova.anifriends.domain.shelter.Shelter; +import com.clova.anifriends.domain.shelter.support.ShelterFixture; +import com.clova.anifriends.domain.volunteer.Volunteer; +import com.clova.anifriends.domain.volunteer.support.VolunteerFixture; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +class PaymentRepositoryTest extends BaseRepositoryTest { + + @Nested + @DisplayName("updatePaymentStatus 실행 시") + class UpdatePaymentStatusTest { + + @Test + @DisplayName("성공") + void updatePaymentStatus() { + // given + Shelter shelter = ShelterFixture.shelter(); + Volunteer volunteer = VolunteerFixture.volunteer(); + Donation donation = DonationFixture.donation(shelter, volunteer); + Payment payment = new Payment(donation); + + shelterRepository.save(shelter); + volunteerRepository.save(volunteer); + paymentRepository.save(payment); + + // when + paymentRepository.updatePaymentStatus(payment.getPaymentId(), PaymentStatus.ABORTED); + + // then + entityManager.flush(); + entityManager.clear(); + + Payment updatedPayment = paymentRepository.findById(payment.getPaymentId()).get(); + assertThat(updatedPayment.getStatus()).isEqualTo(PaymentStatus.ABORTED); + } + } + +} \ No newline at end of file diff --git a/src/test/java/com/clova/anifriends/domain/payment/service/PaymentServiceTest.java b/src/test/java/com/clova/anifriends/domain/payment/service/PaymentServiceTest.java index f2d38344..caf2979c 100644 --- a/src/test/java/com/clova/anifriends/domain/payment/service/PaymentServiceTest.java +++ b/src/test/java/com/clova/anifriends/domain/payment/service/PaymentServiceTest.java @@ -68,8 +68,6 @@ void paySuccess() { // then verify(paymentClient, times(1)).confirmPayment(orderId, paymentKey, amount); assertThat(result).usingRecursiveComparison().isEqualTo(expected); - assertThat(payment.getStatus()).isEqualTo(PaymentStatus.DONE); - assertThat(payment.getPaymentKey()).isEqualTo(paymentKey); } @Test