From ead3a4f1e46bca430327f9a1bc42f9bb1d0c26fa Mon Sep 17 00:00:00 2001 From: forge-bot Date: Thu, 30 Jul 2026 12:16:38 +0000 Subject: [PATCH] =?UTF-8?q?=EC=B9=B4=EB=93=9C=20=EB=A7=A4=EC=9E=85=20?= =?UTF-8?q?=EC=8A=B9=EC=9D=B8=20=EA=B2=BD=EB=A1=9C=20Spring=20Boot=203=20?= =?UTF-8?q?=EC=A0=84=ED=99=98=20(ACX-E2E-1785394564819)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/CardAcquisition.java | 183 ++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 src/main/java/com/acquirex/cardacquisition/entity/CardAcquisition.java diff --git a/src/main/java/com/acquirex/cardacquisition/entity/CardAcquisition.java b/src/main/java/com/acquirex/cardacquisition/entity/CardAcquisition.java new file mode 100644 index 0000000..c50e373 --- /dev/null +++ b/src/main/java/com/acquirex/cardacquisition/entity/CardAcquisition.java @@ -0,0 +1,183 @@ +package com.acquirex.cardacquisition.entity; + +import jakarta.persistence.*; +import jakarta.validation.constraints.*; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** Spring Boot 3 전환: javax.persistence → jakarta.persistence */ +@Entity +@Table(name = "card_acquisitions") +public class CardAcquisition { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "merchant_id", nullable = false) + private String merchantId; + + @Column(name = "card_number", nullable = false) + private String cardNumber; + + @Column(name = "amount", nullable = false, precision = 15, scale = 2) + private BigDecimal amount; + + @Column(name = "currency", nullable = false, length = 3) + private String currency; + + @Enumerated(EnumType.STRING) + @Column(name = "status", nullable = false) + private AcquisitionStatus status = AcquisitionStatus.PENDING; + + @Column(name = "approval_code") + private String approvalCode; + + @Column(name = "request_time", nullable = false) + private LocalDateTime requestTime = LocalDateTime.now(); + + @Column(name = "approval_time") + private LocalDateTime approvalTime; + + @Column(name = "reject_reason") + private String rejectReason; + + public CardAcquisition() {} + + public CardAcquisition(String merchantId, String cardNumber, BigDecimal amount, String currency) { + this.merchantId = merchantId; + this.cardNumber = cardNumber; + this.amount = amount; + this.currency = currency; + this.status = AcquisitionStatus.PENDING; + this.requestTime = LocalDateTime.now(); + } + + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + public String getMerchantId() { return merchantId; } + public void setMerchantId(String merchantId) { this.merchantId = merchantId; } + public String getCardNumber() { return cardNumber; } + public void setCardNumber(String cardNumber) { this.cardNumber = cardNumber; } + public BigDecimal getAmount() { return amount; } + public void setAmount(BigDecimal amount) { this.amount = amount; } + public String getCurrency() { return currency; } + public void setCurrency(String currency) { this.currency = currency; } + public AcquisitionStatus getStatus() { return status; } + public void setStatus(AcquisitionStatus status) { this.status = status; } + public String getApprovalCode() { return approvalCode; } + public void setApprovalCode(String approvalCode) { this.approvalCode = approvalCode; } + public LocalDateTime getRequestTime() { return requestTime; } + public void setRequestTime(LocalDateTime requestTime) { this.requestTime = requestTime; } + public LocalDateTime getApprovalTime() { return approvalTime; } + public void setApprovalTime(LocalDateTime approvalTime) { this.approvalTime = approvalTime; } + public String getRejectReason() { return rejectReason; } + public void setRejectReason(String rejectReason) { this.rejectReason = rejectReason; } + + public void approve(String approvalCode) { + this.status = AcquisitionStatus.APPROVED; + this.approvalCode = approvalCode; + this.approvalTime = LocalDateTime.now(); + } + + public void reject(String reason) { + this.status = AcquisitionStatus.REJECTED; + this.rejectReason = reason; + this.approvalTime = LocalDateTime.now(); + } + + /** Spring Boot 3 전환: javax.persistence → jakarta.persistence */ + public enum AcquisitionStatus { + PENDING, APPROVED, REJECTED, CANCELLED + } +} + +/** Spring Boot 3 전환: javax.validation → jakarta.validation */ +class AcquisitionRequest { + @NotBlank(message = "상점 ID는 필수입니다") + private String merchantId; + + @NotBlank(message = "카드번호는 필수입니다") + @Pattern(regexp = "\\d{10,19}", message = "유효하지 않은 카드번호 형식입니다") + private String cardNumber; + + @NotNull(message = "금액은 필수입니다") + @DecimalMin(value = "0.01", message = "금액은 0보다 커야 합니다") + private BigDecimal amount; + + @NotBlank(message = "통화는 필수입니다") + @Size(min = 3, max = 3, message = "통화 코드는 3자리입니다") + private String currency; + + public AcquisitionRequest() {} + public AcquisitionRequest(String merchantId, String cardNumber, BigDecimal amount, String currency) { + this.merchantId = merchantId; + this.cardNumber = cardNumber; + this.amount = amount; + this.currency = currency; + } + + public String getMerchantId() { return merchantId; } + public void setMerchantId(String merchantId) { this.merchantId = merchantId; } + public String getCardNumber() { return cardNumber; } + public void setCardNumber(String cardNumber) { this.cardNumber = cardNumber; } + public BigDecimal getAmount() { return amount; } + public void setAmount(BigDecimal amount) { this.amount = amount; } + public String getCurrency() { return currency; } + public void setCurrency(String currency) { this.currency = currency; } +} + +class AcquisitionResponse { + private Long id; + private String merchantId; + private String maskedCardNumber; + private BigDecimal amount; + private String currency; + private CardAcquisition.AcquisitionStatus status; + private String approvalCode; + private LocalDateTime requestTime; + private LocalDateTime approvalTime; + private String message; + + public AcquisitionResponse() {} + + public static AcquisitionResponse fromEntity(CardAcquisition entity) { + AcquisitionResponse response = new AcquisitionResponse(); + response.setId(entity.getId()); + response.setMerchantId(entity.getMerchantId()); + response.setMaskedCardNumber(maskCardNumber(entity.getCardNumber())); + response.setAmount(entity.getAmount()); + response.setCurrency(entity.getCurrency()); + response.setStatus(entity.getStatus()); + response.setApprovalCode(entity.getApprovalCode()); + response.setRequestTime(entity.getRequestTime()); + response.setApprovalTime(entity.getApprovalTime()); + return response; + } + + private static String maskCardNumber(String cardNumber) { + if (cardNumber == null || cardNumber.length() < 8) return "****"; + return cardNumber.substring(0, 4) + "****" + cardNumber.substring(cardNumber.length() - 4); + } + + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + public String getMerchantId() { return merchantId; } + public void setMerchantId(String merchantId) { this.merchantId = merchantId; } + public String getMaskedCardNumber() { return maskedCardNumber; } + public void setMaskedCardNumber(String maskedCardNumber) { this.maskedCardNumber = maskedCardNumber; } + public BigDecimal getAmount() { return amount; } + public void setAmount(BigDecimal amount) { this.amount = amount; } + public String getCurrency() { return currency; } + public void setCurrency(String currency) { this.currency = currency; } + public CardAcquisition.AcquisitionStatus getStatus() { return status; } + public void setStatus(CardAcquisition.AcquisitionStatus status) { this.status = status; } + public String getApprovalCode() { return approvalCode; } + public void setApprovalCode(String approvalCode) { this.approvalCode = approvalCode; } + public LocalDateTime getRequestTime() { return requestTime; } + public void setRequestTime(LocalDateTime requestTime) { this.requestTime = requestTime; } + public LocalDateTime getApprovalTime() { return approvalTime; } + public void setApprovalTime(LocalDateTime approvalTime) { this.approvalTime = approvalTime; } + public String getMessage() { return message; } + public void setMessage(String message) { this.message = message; } +} \ No newline at end of file