From d179fa5c51b79cc04382c35ac1d2531e9c3a8509 Mon Sep 17 00:00:00 2001 From: wooh Date: Fri, 31 Jul 2026 11:35:25 +0900 Subject: [PATCH 1/2] =?UTF-8?q?[Fix]=20=ED=8F=AC=ED=8A=B8=EC=9B=90=20?= =?UTF-8?q?=EA=B2=B0=EC=A0=9C=20orderId=20=EA=B8=B8=EC=9D=B4=20=EC=A0=9C?= =?UTF-8?q?=ED=95=9C=20=EB=8C=80=EC=9D=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 결제 준비 시 생성하는 orderId에서 UUID 하이픈을 제거해 40자 이하로 생성 - Toss/PortOne 결제 준비가 동일한 orderId 생성 로직을 사용하도록 정리 - 결제 준비 응답의 orderId 길이 제한 테스트 추가 --- .../domain/payment/service/PaymentService.java | 9 +++++++-- .../domain/payment/service/PaymentServiceTest.java | 3 +++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/jobdri/jobdri_api/domain/payment/service/PaymentService.java b/src/main/java/com/jobdri/jobdri_api/domain/payment/service/PaymentService.java index c4307336..603e2e04 100644 --- a/src/main/java/com/jobdri/jobdri_api/domain/payment/service/PaymentService.java +++ b/src/main/java/com/jobdri/jobdri_api/domain/payment/service/PaymentService.java @@ -46,6 +46,7 @@ public class PaymentService { private static final String EXPECTED_PAYMENT_METHOD = "간편결제"; private static final String EXPECTED_EASY_PAY_PROVIDER = "토스페이"; + private static final String ORDER_ID_PREFIX = "jobdri-"; private final UserService userService; private final PaymentRepository paymentRepository; @@ -78,7 +79,7 @@ public PaymentPrepareResponse prepare(User user, PaymentPrepareRequest request) if (provider == PaymentProviderType.PORTONE) { return preparePortOne(validatedUser, plan); } - String orderId = "jobdri-" + UUID.randomUUID(); + String orderId = generateOrderId(); Payment payment = paymentTransactionService.createPendingPayment( validatedUser.getId(), plan, @@ -131,7 +132,7 @@ public PaymentPrepareResponse prepare(User user, PaymentPrepareRequest request) private PaymentPrepareResponse preparePortOne(User validatedUser, CreditPlan plan) { PortOnePrepareData prepareData = portOneClient.prepareData(); - String orderId = "jobdri-" + UUID.randomUUID(); + String orderId = generateOrderId(); Payment payment = paymentTransactionService.createPortOnePendingPayment( validatedUser.getId(), plan, @@ -153,6 +154,10 @@ private PaymentPrepareResponse preparePortOne(User validatedUser, CreditPlan pla ); } + private String generateOrderId() { + return ORDER_ID_PREFIX + UUID.randomUUID().toString().replace("-", ""); + } + @Transactional(propagation = Propagation.NOT_SUPPORTED) public PaymentConfirmResponse confirm(User user, PaymentConfirmRequest request) { User validatedUser = userService.validateUser(user); diff --git a/src/test/java/com/jobdri/jobdri_api/domain/payment/service/PaymentServiceTest.java b/src/test/java/com/jobdri/jobdri_api/domain/payment/service/PaymentServiceTest.java index 5f4666d3..87a79a7c 100644 --- a/src/test/java/com/jobdri/jobdri_api/domain/payment/service/PaymentServiceTest.java +++ b/src/test/java/com/jobdri/jobdri_api/domain/payment/service/PaymentServiceTest.java @@ -105,6 +105,7 @@ void prepare() { PaymentPrepareResponse response = paymentService.prepare(user, new PaymentPrepareRequest("FIVE_TIMES")); assertThat(response.orderId()).startsWith("jobdri-"); + assertThat(response.orderId()).hasSizeLessThanOrEqualTo(40); assertThat(response.orderName()).isEqualTo("JobDri 크레딧 5회권"); assertThat(response.amount()).isEqualTo(11500); assertThat(response.creditAmount()).isEqualTo(5); @@ -643,6 +644,8 @@ void preparePortOneReturnsPublicSdkParameters() { ); assertThat(response.provider()).isEqualTo(PaymentProviderType.PORTONE); + assertThat(response.orderId()).startsWith("jobdri-"); + assertThat(response.orderId()).hasSizeLessThanOrEqualTo(40); assertThat(response.portOneStoreId()).isEqualTo("store-test"); assertThat(response.portOneChannelKey()).isEqualTo("channel-key-test"); assertThat(response.currency()).isEqualTo("KRW"); From ba1bd1c050f93e549fba330c5c66dcba77715a51 Mon Sep 17 00:00:00 2001 From: wooh Date: Fri, 31 Jul 2026 11:39:52 +0900 Subject: [PATCH 2/2] =?UTF-8?q?[Fix]=20=EA=B2=B0=EC=A0=9C=20orderId=20?= =?UTF-8?q?=ED=8F=AC=EB=A7=B7=20=EA=B2=80=EC=A6=9D=20=EA=B0=95=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 결제 준비 응답의 orderId 테스트를 길이 검증에서 전체 포맷 검증으로 변경 - jobdri- prefix와 32자리 소문자 hex 문자열 형식을 Toss/PortOne 결제 흐름에 동일하게 적용 --- .../domain/payment/service/PaymentServiceTest.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/jobdri/jobdri_api/domain/payment/service/PaymentServiceTest.java b/src/test/java/com/jobdri/jobdri_api/domain/payment/service/PaymentServiceTest.java index 87a79a7c..53ee9286 100644 --- a/src/test/java/com/jobdri/jobdri_api/domain/payment/service/PaymentServiceTest.java +++ b/src/test/java/com/jobdri/jobdri_api/domain/payment/service/PaymentServiceTest.java @@ -56,6 +56,7 @@ class PaymentServiceTest { private static final String TEST_PORTONE_WEBHOOK_SECRET = "whsec_dGVzdC13ZWJob29rLXNlY3JldA=="; + private static final String ORDER_ID_PATTERN = "^jobdri-[0-9a-f]{32}$"; @Autowired private PaymentService paymentService; @@ -104,8 +105,7 @@ void prepare() { PaymentPrepareResponse response = paymentService.prepare(user, new PaymentPrepareRequest("FIVE_TIMES")); - assertThat(response.orderId()).startsWith("jobdri-"); - assertThat(response.orderId()).hasSizeLessThanOrEqualTo(40); + assertThat(response.orderId()).matches(ORDER_ID_PATTERN); assertThat(response.orderName()).isEqualTo("JobDri 크레딧 5회권"); assertThat(response.amount()).isEqualTo(11500); assertThat(response.creditAmount()).isEqualTo(5); @@ -644,8 +644,7 @@ void preparePortOneReturnsPublicSdkParameters() { ); assertThat(response.provider()).isEqualTo(PaymentProviderType.PORTONE); - assertThat(response.orderId()).startsWith("jobdri-"); - assertThat(response.orderId()).hasSizeLessThanOrEqualTo(40); + assertThat(response.orderId()).matches(ORDER_ID_PATTERN); assertThat(response.portOneStoreId()).isEqualTo("store-test"); assertThat(response.portOneChannelKey()).isEqualTo("channel-key-test"); assertThat(response.currency()).isEqualTo("KRW");