Skip to content

Commit bd2c319

Browse files
authored
Merge pull request #233 from prgrms-web-devcourse-final-project/fix#232
[Fix]: 결제 수단 수정 오류 -3
2 parents 053e7f7 + c12cd45 commit bd2c319

File tree

5 files changed

+1
-100
lines changed

5 files changed

+1
-100
lines changed

src/main/java/com/backend/domain/payment/controller/ApiV1PaymentMethodController.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,7 @@ public RsData<PaymentMethodResponse> getOne(
106106
}
107107

108108
@PutMapping("/{id}")
109-
@Operation(summary = "결제 수단 수정", description = "CARD 수정: alias, isDefault, brand, last4, expMonth, expYear만 보내고 bankCode, bankName, acctLast4는 삭제\n\n" +
110-
"BANK 수정: alias, isDefault, bankCode(선택), bankName, acctLast4만 보내고 brand, last4, expMonth, expYear는 삭제")
109+
@Operation(summary = "결제 수단 수정", description = "수정 시에는 alias, isDefault만 반영합니다.")
111110
@ApiResponses({
112111
@ApiResponse(responseCode = "200", description = "수정 성공",
113112
content = @Content(schema = @Schema(implementation = RsData.class))),

src/main/java/com/backend/domain/payment/dto/request/PaymentMethodEditRequest.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,4 @@ public class PaymentMethodEditRequest {
88
// 공통..
99
private String alias; // 별명
1010
private Boolean isDefault; // 기본 여부
11-
12-
// CARD 전용(해당 타입일 때만 반영)..
13-
private String brand;
14-
private String last4;
15-
private Integer expMonth;
16-
private Integer expYear;
17-
18-
// BANK 전용(해당 타입일 때만 반영)..
19-
private String bankCode; // 선택
20-
private String bankName;
21-
private String acctLast4;
2211
}

src/main/java/com/backend/domain/payment/service/PaymentMethodService.java

Lines changed: 0 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -180,16 +180,7 @@ public PaymentMethodResponse edit(Long memberId, Long paymentMethodId, PaymentMe
180180
PaymentMethod entity = paymentMethodRepository.findByIdAndMemberAndDeletedFalse(paymentMethodId, member)
181181
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "결제 수단을 찾을 수 없습니다."));
182182

183-
// 문자열 정규화: "" / " " → null
184183
req.setAlias(nvlBlankToNull(req.getAlias()));
185-
req.setBrand(nvlBlankToNull(req.getBrand()));
186-
req.setLast4(nvlBlankToNull(req.getLast4()));
187-
req.setBankCode(nvlBlankToNull(req.getBankCode()));
188-
req.setBankName(nvlBlankToNull(req.getBankName()));
189-
req.setAcctLast4(nvlBlankToNull(req.getAcctLast4()));
190-
191-
// 타입 불일치 필드가 들어오면 즉시 400..
192-
ensureNoCrossTypeFields(entity.getMethodType(), req);
193184

194185
// 별칭..
195186
if (req.getAlias() != null) {
@@ -212,66 +203,9 @@ public PaymentMethodResponse edit(Long memberId, Long paymentMethodId, PaymentMe
212203
}
213204
}
214205

215-
// 타입별 부분 수정..
216-
switch (entity.getMethodType()) {
217-
case CARD -> {
218-
if (req.getBrand() != null) entity.setBrand(req.getBrand());
219-
if (req.getLast4() != null) entity.setLast4(req.getLast4());
220-
if (req.getExpMonth() != null) entity.setExpMonth(req.getExpMonth());
221-
if (req.getExpYear() != null) entity.setExpYear(req.getExpYear());
222-
223-
// 최소 필드 유지..
224-
if (entity.getBrand() == null || entity.getLast4() == null
225-
|| entity.getExpMonth() == null || entity.getExpYear() == null) {
226-
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "CARD는 brand, last4, expMonth, expYear가 필요합니다.");
227-
}
228-
229-
// 반대 타입 필드는 항상 null 보장..
230-
entity.setBankCode(null);
231-
entity.setBankName(null);
232-
entity.setAcctLast4(null);
233-
}
234-
case BANK -> {
235-
if (req.getBankCode() != null) entity.setBankCode(req.getBankCode());
236-
if (req.getBankName() != null) entity.setBankName(req.getBankName());
237-
if (req.getAcctLast4() != null) entity.setAcctLast4(req.getAcctLast4());
238-
239-
if (entity.getBankName() == null || entity.getAcctLast4() == null) {
240-
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "BANK는 bankName, acctLast4가 필요합니다. (bankCode 선택)");
241-
}
242-
243-
// 반대 타입 필드는 항상 null 보장..
244-
entity.setBrand(null);
245-
entity.setLast4(null);
246-
entity.setExpMonth(null);
247-
entity.setExpYear(null);
248-
}
249-
}
250-
251206
return toResponse(entity);
252207
}
253208

254-
// 타입과 맞지 않는 필드가 요청에 포함되면 400 (빈문자 제외)
255-
private void ensureNoCrossTypeFields(PaymentMethodType type, PaymentMethodEditRequest req) {
256-
boolean hasCardFields =
257-
nvlBlankToNull(req.getBrand()) != null ||
258-
nvlBlankToNull(req.getLast4()) != null ||
259-
req.getExpMonth() != null ||
260-
req.getExpYear() != null;
261-
262-
boolean hasBankFields =
263-
nvlBlankToNull(req.getBankName()) != null ||
264-
nvlBlankToNull(req.getAcctLast4()) != null ||
265-
nvlBlankToNull(req.getBankCode()) != null;
266-
267-
if (type == PaymentMethodType.CARD && hasBankFields) {
268-
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "CARD 수단에는 BANK 필드를 수정할 수 없습니다.");
269-
}
270-
if (type == PaymentMethodType.BANK && hasCardFields) {
271-
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "BANK 수단에는 CARD 필드를 수정할 수 없습니다.");
272-
}
273-
}
274-
275209
// 공백/빈문자 → null
276210
private String nvlBlankToNull(String s) {
277211
if (s == null) return null;

src/test/java/com/backend/domain/payment/controller/ApiV1PaymentMethodControllerTest.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -150,10 +150,6 @@ void edit_card_success() throws Exception {
150150
PaymentMethodEditRequest req = new PaymentMethodEditRequest();
151151
req.setAlias("경조/여행 전용");
152152
req.setIsDefault(true);
153-
req.setBrand("SHINHAN");
154-
req.setLast4("2222");
155-
req.setExpMonth(5);
156-
req.setExpYear(2035);
157153

158154
mvc.perform(put("/api/v1/paymentMethods/{id}", saved.getId())
159155
.header("Authorization", bearer("[email protected]"))
@@ -212,9 +208,6 @@ void edit_bank_success() throws Exception {
212208
PaymentMethodEditRequest req = new PaymentMethodEditRequest();
213209
req.setAlias("월급통장");
214210
req.setIsDefault(false);
215-
req.setBankCode("088");
216-
req.setBankName("신한");
217-
req.setAcctLast4("9999");
218211

219212
mvc.perform(put("/api/v1/paymentMethods/{id}", saved.getId())
220213
.header("Authorization", bearer("[email protected]"))

src/test/java/com/backend/domain/payment/service/PaymentMethodServiceTest.java

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -432,11 +432,6 @@ void edit_card_success_updateCardFields() {
432432
PaymentMethodEditRequest req = new PaymentMethodEditRequest();
433433
req.setAlias("경조/여행 전용");
434434
req.setIsDefault(true);
435-
req.setBrand("SHINHAN");
436-
req.setLast4("2222");
437-
req.setExpMonth(5);
438-
req.setExpYear(2035);
439-
// BANK 필드 미전달 (또는 null)
440435

441436
// when
442437
PaymentMethodResponse res = paymentMethodService.edit(1L, 10L, req);
@@ -462,7 +457,6 @@ void edit_card_reject_bankFields() {
462457
when(paymentMethodRepository.findByIdAndMemberAndDeletedFalse(10L, member)).thenReturn(Optional.of(entity));
463458

464459
PaymentMethodEditRequest req = new PaymentMethodEditRequest();
465-
req.setBankName("KB"); // 교차 타입 값
466460

467461
assertThatThrownBy(() -> paymentMethodService.edit(1L, 10L, req))
468462
.isInstanceOf(ResponseStatusException.class)
@@ -481,8 +475,6 @@ void edit_card_blank_bankFields_areIgnored() {
481475

482476
PaymentMethodEditRequest req = new PaymentMethodEditRequest();
483477
req.setAlias("새 별칭");
484-
req.setBankName(" "); // 공백 → null 정규화
485-
req.setBankCode(""); // 빈문자 → null 정규화
486478

487479
PaymentMethodResponse res = paymentMethodService.edit(1L, 10L, req);
488480

@@ -543,9 +535,6 @@ void edit_bank_success_updateBankFields() {
543535
PaymentMethodEditRequest req = new PaymentMethodEditRequest();
544536
req.setAlias("월급통장");
545537
req.setIsDefault(false);
546-
req.setBankCode("088");
547-
req.setBankName("신한");
548-
req.setAcctLast4("9999");
549538

550539
PaymentMethodResponse res = paymentMethodService.edit(1L, 11L, req);
551540

@@ -568,7 +557,6 @@ void edit_bank_reject_cardFields() {
568557
when(paymentMethodRepository.findByIdAndMemberAndDeletedFalse(11L, member)).thenReturn(Optional.of(entity));
569558

570559
PaymentMethodEditRequest req = new PaymentMethodEditRequest();
571-
req.setBrand("VISA"); // 교차 타입 값
572560

573561
assertThatThrownBy(() -> paymentMethodService.edit(1L, 11L, req))
574562
.isInstanceOf(ResponseStatusException.class)
@@ -587,8 +575,6 @@ void edit_bank_blank_cardFields_areIgnored() {
587575

588576
PaymentMethodEditRequest req = new PaymentMethodEditRequest();
589577
req.setAlias("새 통장");
590-
req.setBrand(" "); // 공백 → null 정규화
591-
req.setLast4(""); // 빈문자 → null 정규화
592578

593579
PaymentMethodResponse res = paymentMethodService.edit(1L, 11L, req);
594580

0 commit comments

Comments
 (0)