Skip to content

Commit b3616f3

Browse files
committed
[Refactor]: 코드 리팩토링 -2
- 이해하기 쉽게 주석 추가 - Cash/Payment/PaymentMethod 컨트롤러에 @ApiResponses 에러 코드 추가 - 노션 request, response 수정
1 parent ab264d9 commit b3616f3

File tree

6 files changed

+181
-43
lines changed

6 files changed

+181
-43
lines changed

src/main/java/com/backend/domain/cash/controller/ApiV1CashController.java

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@
88
import com.backend.domain.member.service.MemberService;
99
import com.backend.global.response.RsData;
1010
import io.swagger.v3.oas.annotations.Operation;
11+
import io.swagger.v3.oas.annotations.Parameter;
12+
import io.swagger.v3.oas.annotations.media.Content;
13+
import io.swagger.v3.oas.annotations.media.Schema;
14+
import io.swagger.v3.oas.annotations.responses.ApiResponse;
15+
import io.swagger.v3.oas.annotations.responses.ApiResponses;
1116
import io.swagger.v3.oas.annotations.tags.Tag;
1217
import lombok.RequiredArgsConstructor;
1318
import org.springframework.http.HttpStatus;
@@ -26,43 +31,72 @@ public class ApiV1CashController {
2631
private final MemberService memberService;
2732
private final CashService cashService;
2833

29-
@GetMapping
30-
@Operation(summary = "내 지갑 잔액 조회", description = "지갑이 없으면 404를 반환합니다.")
31-
@Transactional(readOnly = true)
32-
public RsData<CashResponse> getMyCash(@AuthenticationPrincipal User user) {
34+
private Member getActor(User user) {
3335
if (user == null) {
3436
throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, "로그인이 필요합니다.");
3537
}
36-
Member actor = memberService.findMemberByEmail(user.getUsername());
38+
return memberService.findMemberByEmail(user.getUsername());
39+
}
40+
41+
@GetMapping
42+
@Operation(summary = "내 지갑 잔액 조회", description = "지갑이 없으면 404를 반환합니다.")
43+
@ApiResponses(value = {
44+
@ApiResponse(responseCode = "200", description = "잔액 조회 성공",
45+
content = @Content(schema = @Schema(implementation = RsData.class))),
46+
@ApiResponse(responseCode = "401", description = "인증 실패",
47+
content = @Content(schema = @Schema(implementation = RsData.class))),
48+
@ApiResponse(responseCode = "404", description = "지갑 없음",
49+
content = @Content(schema = @Schema(implementation = RsData.class)))
50+
})
51+
@Transactional(readOnly = true)
52+
public RsData<CashResponse> getMyCash(@Parameter(hidden = true) @AuthenticationPrincipal User user) {
53+
Member actor = getActor(user);
3754
CashResponse data = cashService.getMyCashResponse(actor);
3855
return RsData.ok("지갑 잔액이 조회되었습니다.", data);
3956
}
4057

4158
@GetMapping("/transactions")
4259
@Operation(summary = "내 원장 목록(입금/출금)", description = "지갑 미생성 시 404 반환")
60+
@ApiResponses(value = {
61+
@ApiResponse(responseCode = "200", description = "원장 목록 조회 성공",
62+
content = @Content(schema = @Schema(implementation = RsData.class))),
63+
@ApiResponse(responseCode = "400", description = "잘못된 요청",
64+
content = @Content(schema = @Schema(implementation = RsData.class))),
65+
@ApiResponse(responseCode = "401", description = "인증 실패",
66+
content = @Content(schema = @Schema(implementation = RsData.class))),
67+
@ApiResponse(responseCode = "404", description = "지갑 없음",
68+
content = @Content(schema = @Schema(implementation = RsData.class)))
69+
})
4370
@Transactional(readOnly = true)
4471
public RsData<CashTransactionsResponse> getMyTransactions(
45-
@AuthenticationPrincipal User user,
72+
@Parameter(hidden = true) @AuthenticationPrincipal User user,
4673
@RequestParam(defaultValue = "1") int page,
4774
@RequestParam(defaultValue = "20") int size
4875
) {
49-
if (user == null) {
50-
throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, "로그인이 필요합니다.");
51-
}
52-
Member actor = memberService.findMemberByEmail(user.getUsername());
76+
Member actor = getActor(user);
5377
CashTransactionsResponse data = cashService.getMyTransactions(actor, page, size);
5478
return RsData.ok("지갑 원장 목록이 조회되었습니다.", data);
5579
}
5680

5781
@GetMapping("/transactions/{transactionId}")
58-
@Operation(summary = "내 원장 단건 상세")
82+
@Operation(summary = "내 원장 단건 상세", description = "해당 거래가 없으면 404를 반환합니다.")
83+
@ApiResponses(value = {
84+
@ApiResponse(responseCode = "200", description = "원장 상세 조회 성공",
85+
content = @Content(schema = @Schema(implementation = RsData.class))),
86+
@ApiResponse(responseCode = "401", description = "인증 실패",
87+
content = @Content(schema = @Schema(implementation = RsData.class))),
88+
@ApiResponse(responseCode = "403", description = "권한 없음",
89+
content = @Content(schema = @Schema(implementation = RsData.class))),
90+
@ApiResponse(responseCode = "404", description = "거래 없음",
91+
content = @Content(schema = @Schema(implementation = RsData.class)))
92+
})
5993
@Transactional(readOnly = true)
6094
public RsData<CashTransactionResponse> getMyTransactionDetail(
61-
@AuthenticationPrincipal User user,
95+
@Parameter(hidden = true) @AuthenticationPrincipal User user,
96+
@Parameter(description = "거래 ID")
6297
@PathVariable Long transactionId
6398
) {
64-
if (user == null) throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, "로그인이 필요합니다.");
65-
Member actor = memberService.findMemberByEmail(user.getUsername());
99+
Member actor = getActor(user);
66100
CashTransactionResponse data = cashService.getMyTransactionDetail(actor, transactionId);
67101
return RsData.ok("지갑 원장 상세가 조회되었습니다.", data);
68102
}

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

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@
1212
import com.backend.domain.payment.service.TossBillingClientService;
1313
import com.backend.global.response.RsData;
1414
import io.swagger.v3.oas.annotations.Operation;
15+
import io.swagger.v3.oas.annotations.Parameter;
16+
import io.swagger.v3.oas.annotations.media.Content;
17+
import io.swagger.v3.oas.annotations.media.Schema;
18+
import io.swagger.v3.oas.annotations.responses.ApiResponse;
19+
import io.swagger.v3.oas.annotations.responses.ApiResponses;
1520
import io.swagger.v3.oas.annotations.tags.Tag;
1621
import jakarta.validation.Valid;
1722
import lombok.RequiredArgsConstructor;
@@ -39,9 +44,19 @@ private Member getActor(User user) {
3944
}
4045

4146
@PostMapping
42-
@Operation(summary="지갑 충전 요청", description="idempotencyKey로 중복 충전 방지, 일단은 idempotencyKey 아무키로 등록해주세요!.")
47+
@Operation(summary="지갑 충전 요청", description="idempotencyKey로 중복 충전 방지, 일단은 idempotencyKey 아무키로 등록해주세요!")
48+
@ApiResponses({
49+
@ApiResponse(responseCode = "201", description = "충전 완료",
50+
content = @Content(schema = @Schema(implementation = RsData.class))),
51+
@ApiResponse(responseCode = "400", description = "잘못된 요청",
52+
content = @Content(schema = @Schema(implementation = RsData.class))),
53+
@ApiResponse(responseCode = "401", description = "인증 실패",
54+
content = @Content(schema = @Schema(implementation = RsData.class))),
55+
@ApiResponse(responseCode = "409", description = "멱등키 충돌",
56+
content = @Content(schema = @Schema(implementation = RsData.class)))
57+
})
4358
public RsData<PaymentResponse> charge(
44-
@AuthenticationPrincipal User user,
59+
@Parameter(hidden = true) @AuthenticationPrincipal User user,
4560
@RequestBody @Valid PaymentRequest req
4661
) {
4762
Member actor = getActor(user);
@@ -51,8 +66,18 @@ public RsData<PaymentResponse> charge(
5166

5267
@PostMapping("/toss/issue-billing-key")
5368
@Operation(summary="토스 빌링키 발급", description="카드/계좌 등록용 빌링키를 발급합니다.")
69+
@ApiResponses({
70+
@ApiResponse(responseCode = "200", description = "발급 성공",
71+
content = @Content(schema = @Schema(implementation = RsData.class))),
72+
@ApiResponse(responseCode = "400", description = "잘못된 요청",
73+
content = @Content(schema = @Schema(implementation = RsData.class))),
74+
@ApiResponse(responseCode = "401", description = "인증 실패",
75+
content = @Content(schema = @Schema(implementation = RsData.class))),
76+
@ApiResponse(responseCode = "502", description = "PG 연동 오류",
77+
content = @Content(schema = @Schema(implementation = RsData.class)))
78+
})
5479
public RsData<TossIssueBillingKeyResponse> issueBillingKey(
55-
@AuthenticationPrincipal User user,
80+
@Parameter(hidden = true) @AuthenticationPrincipal User user,
5681
@RequestBody TossIssueBillingKeyRequest req
5782
) {
5883
Member me = getActor(user);
@@ -64,9 +89,17 @@ public RsData<TossIssueBillingKeyResponse> issueBillingKey(
6489

6590
@GetMapping("/me")
6691
@Operation(summary="내 결제 내역")
92+
@ApiResponses({
93+
@ApiResponse(responseCode = "200", description = "내역 조회 성공",
94+
content = @Content(schema = @Schema(implementation = RsData.class))),
95+
@ApiResponse(responseCode = "400", description = "잘못된 요청",
96+
content = @Content(schema = @Schema(implementation = RsData.class))),
97+
@ApiResponse(responseCode = "401", description = "인증 실패",
98+
content = @Content(schema = @Schema(implementation = RsData.class)))
99+
})
67100
@Transactional(readOnly = true)
68101
public RsData<MyPaymentsResponse> getMyPayments(
69-
@AuthenticationPrincipal User user,
102+
@Parameter(hidden = true) @AuthenticationPrincipal User user,
70103
@RequestParam(defaultValue = "1") int page,
71104
@RequestParam(defaultValue = "20") int size
72105
) {
@@ -78,9 +111,19 @@ public RsData<MyPaymentsResponse> getMyPayments(
78111

79112
@GetMapping("/me/{paymentId}")
80113
@Operation(summary = "내 결제 단건 상세")
114+
@ApiResponses({
115+
@ApiResponse(responseCode = "200", description = "상세 조회 성공",
116+
content = @Content(schema = @Schema(implementation = RsData.class))),
117+
@ApiResponse(responseCode = "401", description = "인증 실패",
118+
content = @Content(schema = @Schema(implementation = RsData.class))),
119+
@ApiResponse(responseCode = "403", description = "권한 없음",
120+
content = @Content(schema = @Schema(implementation = RsData.class))),
121+
@ApiResponse(responseCode = "404", description = "결제 내역 없음",
122+
content = @Content(schema = @Schema(implementation = RsData.class)))
123+
})
81124
@Transactional(readOnly = true)
82125
public RsData<MyPaymentResponse> getMyPaymentDetail(
83-
@AuthenticationPrincipal User user,
126+
@Parameter(hidden = true) @AuthenticationPrincipal User user,
84127
@PathVariable Long paymentId
85128
) {
86129
Member actor = getActor(user);

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

Lines changed: 60 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@
1111
import com.backend.domain.payment.service.PaymentMethodService;
1212
import com.backend.global.response.RsData;
1313
import io.swagger.v3.oas.annotations.Operation;
14+
import io.swagger.v3.oas.annotations.Parameter;
15+
import io.swagger.v3.oas.annotations.media.Content;
16+
import io.swagger.v3.oas.annotations.media.Schema;
17+
import io.swagger.v3.oas.annotations.responses.ApiResponse;
18+
import io.swagger.v3.oas.annotations.responses.ApiResponses;
1419
import io.swagger.v3.oas.annotations.tags.Tag;
1520
import lombok.RequiredArgsConstructor;
1621
import org.springframework.http.HttpStatus;
@@ -41,10 +46,21 @@ private Member getActor(User user) {
4146
@PostMapping
4247
@Operation(summary = "결제 수단 등록", description = "type: card, bank \n\n" + "CARD 등록: alias, isDefault, brand, last4, expMonth, expYear만 보내고 bankCode, bankName, acctLast4는 넣지마세요!\n\n" +
4348
"BANK 등록: alias, isDefault, bankCode(선택), bankName, acctLast4만 보내고 brand, last4, expMonth, expYear는 넣지마세요!")
49+
@ApiResponses({
50+
@ApiResponse(responseCode = "201", description = "등록 성공",
51+
content = @Content(schema = @Schema(implementation = RsData.class))),
52+
@ApiResponse(responseCode = "400", description = "잘못된 요청",
53+
content = @Content(schema = @Schema(implementation = RsData.class))),
54+
@ApiResponse(responseCode = "401", description = "인증 실패",
55+
content = @Content(schema = @Schema(implementation = RsData.class))),
56+
@ApiResponse(responseCode = "409", description = "별명(alias) 중복 등 충돌",
57+
content = @Content(schema = @Schema(implementation = RsData.class)))
58+
})
4459
public RsData<PaymentMethodResponse> create(
45-
@AuthenticationPrincipal User user,
60+
@Parameter(hidden = true) @AuthenticationPrincipal User user,
4661
@RequestBody PaymentMethodCreateRequest request
4762
) {
63+
4864
Member actor = getActor(user);
4965
PaymentMethodResponse data = paymentMethodService.create(actor.getId(), request);
5066

@@ -53,6 +69,12 @@ public RsData<PaymentMethodResponse> create(
5369

5470
@GetMapping
5571
@Operation(summary = "결제 수단 다건 조회", description = "로그인한 사용자의 결제 수단 목록을 반환합니다.")
72+
@ApiResponses({
73+
@ApiResponse(responseCode = "200", description = "목록 조회 성공",
74+
content = @Content(schema = @Schema(implementation = RsData.class))),
75+
@ApiResponse(responseCode = "401", description = "인증 실패",
76+
content = @Content(schema = @Schema(implementation = RsData.class)))
77+
})
5678
@Transactional(readOnly = true)
5779
public RsData<List<PaymentMethodResponse>> list(@AuthenticationPrincipal User user) {
5880
Member actor = getActor(user);
@@ -63,8 +85,18 @@ public RsData<List<PaymentMethodResponse>> list(@AuthenticationPrincipal User us
6385

6486
@GetMapping("/{id}")
6587
@Operation(summary = "결제 수단 단건 조회", description = "로그인한 사용자의 결제 수단 단건을 반환합니다.")
88+
@ApiResponses({
89+
@ApiResponse(responseCode = "200", description = "단건 조회 성공",
90+
content = @Content(schema = @Schema(implementation = RsData.class))),
91+
@ApiResponse(responseCode = "401", description = "인증 실패",
92+
content = @Content(schema = @Schema(implementation = RsData.class))),
93+
@ApiResponse(responseCode = "403", description = "권한 없음",
94+
content = @Content(schema = @Schema(implementation = RsData.class))),
95+
@ApiResponse(responseCode = "404", description = "결제 수단 없음",
96+
content = @Content(schema = @Schema(implementation = RsData.class)))
97+
})
6698
public RsData<PaymentMethodResponse> getOne(
67-
@AuthenticationPrincipal User user,
99+
@Parameter(hidden = true) @AuthenticationPrincipal User user,
68100
@PathVariable("id") Long paymentMethodId
69101
) {
70102
Member actor = getActor(user);
@@ -76,8 +108,22 @@ public RsData<PaymentMethodResponse> getOne(
76108
@PutMapping("/{id}")
77109
@Operation(summary = "결제 수단 수정", description = "CARD 수정: alias, isDefault, brand, last4, expMonth, expYear만 보내고 bankCode, bankName, acctLast4는 삭제\n\n" +
78110
"BANK 수정: alias, isDefault, bankCode(선택), bankName, acctLast4만 보내고 brand, last4, expMonth, expYear는 삭제")
111+
@ApiResponses({
112+
@ApiResponse(responseCode = "200", description = "수정 성공",
113+
content = @Content(schema = @Schema(implementation = RsData.class))),
114+
@ApiResponse(responseCode = "400", description = "잘못된 요청",
115+
content = @Content(schema = @Schema(implementation = RsData.class))),
116+
@ApiResponse(responseCode = "401", description = "인증 실패",
117+
content = @Content(schema = @Schema(implementation = RsData.class))),
118+
@ApiResponse(responseCode = "403", description = "권한 없음",
119+
content = @Content(schema = @Schema(implementation = RsData.class))),
120+
@ApiResponse(responseCode = "404", description = "결제수단 없음",
121+
content = @Content(schema = @Schema(implementation = RsData.class))),
122+
@ApiResponse(responseCode = "409", description = "별명(alias) 중복 등 충돌",
123+
content = @Content(schema = @Schema(implementation = RsData.class)))
124+
})
79125
public RsData<PaymentMethodResponse> edit(
80-
@AuthenticationPrincipal User user,
126+
@Parameter(hidden = true) @AuthenticationPrincipal User user,
81127
@PathVariable("id") Long paymentMethodId,
82128
@RequestBody PaymentMethodEditRequest request
83129
) {
@@ -89,8 +135,18 @@ public RsData<PaymentMethodResponse> edit(
89135

90136
@DeleteMapping("/{id}")
91137
@Operation(summary = "결제 수단 삭제", description = "기본 수단 삭제 시 최근 생성 수단으로 자동 승계합니다.")
138+
@ApiResponses({
139+
@ApiResponse(responseCode = "200", description = "삭제 성공",
140+
content = @Content(schema = @Schema(implementation = RsData.class))),
141+
@ApiResponse(responseCode = "401", description = "인증 실패",
142+
content = @Content(schema = @Schema(implementation = RsData.class))),
143+
@ApiResponse(responseCode = "403", description = "권한 없음",
144+
content = @Content(schema = @Schema(implementation = RsData.class))),
145+
@ApiResponse(responseCode = "404", description = "결제수단 없음",
146+
content = @Content(schema = @Schema(implementation = RsData.class)))
147+
})
92148
public RsData<PaymentMethodDeleteResponse> delete(
93-
@AuthenticationPrincipal User user,
149+
@Parameter(hidden = true) @AuthenticationPrincipal User user,
94150
@PathVariable("id") Long paymentMethodId
95151
) {
96152
Member actor = getActor(user);

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,7 @@ public PaymentMethodDeleteResponse deleteAndReport(Long memberId, Long paymentMe
272272
Member member = memberRepository.findById(memberId)
273273
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "회원이 존재하지 않습니다."));
274274

275+
// 본인 소유 + 삭제 안 된 수단 찾기..
275276
PaymentMethod target = paymentMethodRepository.findByIdAndMemberAndDeletedFalse(paymentMethodId, member)
276277
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "결제 수단을 찾을 수 없습니다."));
277278

@@ -281,6 +282,7 @@ public PaymentMethodDeleteResponse deleteAndReport(Long memberId, Long paymentMe
281282

282283
Long newDefaultId = null;
283284
if (wasDefault) {
285+
// 기본이 없어졌으니, 가장 최근 만든 수단을 새 기본으로..
284286
newDefaultId = paymentMethodRepository.findFirstByMemberAndDeletedFalseOrderByCreateDateDesc(member)
285287
.map(pm -> { pm.setIsDefault(true); return pm.getId(); })
286288
.orElse(null);
@@ -324,7 +326,4 @@ private PaymentMethodResponse toResponse(PaymentMethod e) {
324326
private boolean isBlank(String s) {
325327
return s == null || s.trim().isEmpty();
326328
}
327-
328-
329-
330329
}

0 commit comments

Comments
 (0)