From 6d8b85a9e37cf6f8776a464ee07178388cdd5cd3 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 7 Sep 2025 21:23:01 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=EC=83=88=EB=A1=9C=EC=9A=B4=20?= =?UTF-8?q?=EC=97=94=ED=8B=B0=ED=8B=B0=EC=97=90=20=EB=A7=9E=EC=B6=98=20Pay?= =?UTF-8?q?mentWriter=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../payment/business/PaymentWriter.kt | 88 +++++++++++++++++++ .../payment/implement/PaymentWriterV2.kt | 80 ----------------- 2 files changed, 88 insertions(+), 80 deletions(-) create mode 100644 src/main/kotlin/roomescape/payment/business/PaymentWriter.kt delete mode 100644 src/main/kotlin/roomescape/payment/implement/PaymentWriterV2.kt diff --git a/src/main/kotlin/roomescape/payment/business/PaymentWriter.kt b/src/main/kotlin/roomescape/payment/business/PaymentWriter.kt new file mode 100644 index 00000000..fd59c4c2 --- /dev/null +++ b/src/main/kotlin/roomescape/payment/business/PaymentWriter.kt @@ -0,0 +1,88 @@ +package roomescape.payment.business + +import com.github.f4b6a3.tsid.TsidFactory +import io.github.oshai.kotlinlogging.KLogger +import io.github.oshai.kotlinlogging.KotlinLogging +import org.springframework.stereotype.Component +import roomescape.common.config.next +import roomescape.payment.exception.PaymentErrorCode +import roomescape.payment.exception.PaymentException +import roomescape.payment.infrastructure.client.* +import roomescape.payment.infrastructure.common.PaymentMethod +import roomescape.payment.infrastructure.common.PaymentType +import roomescape.payment.infrastructure.persistence.CanceledPaymentEntity +import roomescape.payment.infrastructure.persistence.CanceledPaymentRepository +import roomescape.payment.infrastructure.persistence.PaymentDetailEntity +import roomescape.payment.infrastructure.persistence.PaymentDetailRepository +import roomescape.payment.infrastructure.persistence.PaymentEntity +import roomescape.payment.infrastructure.persistence.PaymentRepository +import java.time.LocalDateTime + +private val log: KLogger = KotlinLogging.logger {} + +@Component +class PaymentWriter( + private val paymentRepository: PaymentRepository, + private val paymentDetailRepository: PaymentDetailRepository, + private val canceledPaymentRepository: CanceledPaymentRepository, + private val tsidFactory: TsidFactory, +) { + + fun createPayment( + reservationId: Long, + orderId: String, + paymentType: PaymentType, + paymentClientConfirmResponse: PaymentClientConfirmResponse + ): PaymentEntity { + log.info { "[PaymentWriterV2.createPayment] 결제 승인 및 결제 정보 저장 시작: reservationId=${reservationId}, paymentKey=${paymentClientConfirmResponse.paymentKey}" } + + return paymentClientConfirmResponse.toEntity( + id = tsidFactory.next(), reservationId, orderId, paymentType + ).also { + paymentRepository.save(it) + log.info { "[PaymentWriterV2.createPayment] 결제 승인 및 결제 정보 저장 완료: reservationId=${reservationId}, payment.id=${it.id}" } + } + } + + fun createDetail( + paymentResponse: PaymentClientConfirmResponse, + paymentId: Long, + ): PaymentDetailEntity { + val method: PaymentMethod = paymentResponse.method + val id = tsidFactory.next() + + if (method == PaymentMethod.TRANSFER) { + return paymentDetailRepository.save(paymentResponse.toTransferDetailEntity(id, paymentId)) + } + if (method == PaymentMethod.EASY_PAY && paymentResponse.card == null) { + return paymentDetailRepository.save(paymentResponse.toEasypayPrepaidDetailEntity(id, paymentId)) + } + if (paymentResponse.card != null) { + return paymentDetailRepository.save(paymentResponse.toCardDetailEntity(id, paymentId)) + } + throw PaymentException(PaymentErrorCode.NOT_SUPPORTED_PAYMENT_TYPE) + } + + fun cancel( + memberId: Long, + payment: PaymentEntity, + requestedAt: LocalDateTime, + cancelResponse: PaymentClientCancelResponse + ) { + log.debug { "[PaymentWriterV2.cancelPayment] 결제 취소 정보 저장 시작: payment.id=${payment.id}" } + + val canceledPayment: CanceledPaymentEntity = cancelResponse.cancels.toEntity( + id = tsidFactory.next(), + paymentId = payment.id, + cancelRequestedAt = requestedAt, + canceledBy = memberId + ) + + run { + canceledPaymentRepository.save(canceledPayment) + paymentRepository.save(payment.apply { this.cancel() }) + }.also { + log.debug { "[PaymentWriterV2.cancelPayment] 결제 취소 정보 저장 완료: payment.id=${payment.id}" } + } + } +} diff --git a/src/main/kotlin/roomescape/payment/implement/PaymentWriterV2.kt b/src/main/kotlin/roomescape/payment/implement/PaymentWriterV2.kt deleted file mode 100644 index 3def90da..00000000 --- a/src/main/kotlin/roomescape/payment/implement/PaymentWriterV2.kt +++ /dev/null @@ -1,80 +0,0 @@ -package roomescape.payment.implement - -import com.github.f4b6a3.tsid.TsidFactory -import io.github.oshai.kotlinlogging.KLogger -import io.github.oshai.kotlinlogging.KotlinLogging -import org.springframework.stereotype.Component -import roomescape.common.config.next -import roomescape.payment.exception.PaymentErrorCode -import roomescape.payment.exception.PaymentException -import roomescape.payment.infrastructure.client.v2.* -import roomescape.payment.infrastructure.common.PaymentMethod -import roomescape.payment.infrastructure.persistence.v2.* -import roomescape.reservation.web.ReservationPaymentRequest -import java.time.LocalDateTime - -private val log: KLogger = KotlinLogging.logger {} - -@Component -class PaymentWriterV2( - private val paymentRepository: PaymentRepositoryV2, - private val paymentDetailRepository: PaymentDetailRepository, - private val canceledPaymentRepository: CanceledPaymentRepositoryV2, - private val tsidFactory: TsidFactory, -) { - fun createPayment( - reservationId: Long, - request: ReservationPaymentRequest, - paymentConfirmResponse: PaymentConfirmResponse - ): PaymentEntityV2 { - log.debug { "[PaymentWriterV2.createPayment] 결제 승인 및 결제 정보 저장 시작: reservationId=${reservationId}, paymentKey=${request.paymentKey}" } - - return paymentConfirmResponse.toEntity( - id = tsidFactory.next(), reservationId, request.orderId, request.paymentType - ).also { - paymentRepository.save(it) - createDetail(paymentConfirmResponse, it.id) - log.debug { "[PaymentWriterV2.createPayment] 결제 승인 및 결제 정보 저장 완료: reservationId=${reservationId}, paymentId=${it.id}" } - } - } - - private fun createDetail( - paymentResponse: PaymentConfirmResponse, - paymentId: Long, - ): PaymentDetailEntity { - val method: PaymentMethod = paymentResponse.method - val id = tsidFactory.next() - - if (method == PaymentMethod.TRANSFER) { - return paymentDetailRepository.save(paymentResponse.toTransferDetailEntity(id, paymentId)) - } - if (method == PaymentMethod.EASY_PAY && paymentResponse.card == null) { - return paymentDetailRepository.save(paymentResponse.toEasypayPrepaidDetailEntity(id, paymentId)) - } - if (paymentResponse.card != null) { - return paymentDetailRepository.save(paymentResponse.toCardDetailEntity(id, paymentId)) - } - throw PaymentException(PaymentErrorCode.NOT_SUPPORTED_PAYMENT_TYPE) - } - - fun createCanceledPayment( - memberId: Long, - payment: PaymentEntityV2, - requestedAt: LocalDateTime, - cancelResponse: PaymentCancelResponseV2 - ) { - log.debug { "[PaymentWriterV2.cancelPayment] 취소된 결제 정보 저장 시작: paymentId=${payment.id}, paymentKey=${payment.paymentKey}" } - - val canceledPayment: CanceledPaymentEntityV2 = cancelResponse.cancels.toEntity( - id = tsidFactory.next(), - paymentId = payment.id, - cancelRequestedAt = requestedAt, - canceledBy = memberId - ) - - canceledPaymentRepository.save(canceledPayment).also { - payment.cancel() - log.debug { "[PaymentWriterV2.cancelPayment] 취소된 결제 정보 저장 완료: paymentId=${payment.id}, canceledPaymentId=${it.id}, paymentKey=${payment.paymentKey}" } - } - } -}