Skip to content

feat: 구독 관리 시스템 구현 및 안정성 강화#8

Merged
DongHyeonka merged 4 commits intoSynapsesa:developfrom
DongHyeonka:feature/subcription-management
Jul 29, 2025
Merged

feat: 구독 관리 시스템 구현 및 안정성 강화#8
DongHyeonka merged 4 commits intoSynapsesa:developfrom
DongHyeonka:feature/subcription-management

Conversation

@DongHyeonka
Copy link
Contributor

📌 관련 이슈

✨ PR 작업 내용

구독 서비스의 안정성과 데이터 정합성을 강화하기 위해 결제 처리 로직을 전반적으로 개선했습니다.

정기 결제 실패 처리 고도화
결제 실패 시 구독 상태를 즉시 PAYMENT_FAILED로 변경하고, 재시도 횟수(retryCount)를 기록하도록 Subscription 엔티티와 관련 서비스를 수정했습니다. 이를 통해 요금 미납 상태에서 서비스를 계속 이용하는 문제를 방지하고, 향후 결제 재시도 기능의 기반을 마련했습니다.

정기 결제 대상 조회 쿼리 안정성 강화
스케줄러 장애 시 발생할 수 있는 중복 결제 위험을 원천적으로 차단하기 위해, 정기 결제 대상 조회 쿼리 조건을 '특정일에 만료되는 구독'만 정확히 조회하도록 변경했습니다.

구독 만료 처리 스케줄러 추가
사용자가 취소했거나 결제에 최종 실패한 구독을 자동으로 정리하는 스케줄러(expireSubscriptions)를 추가했습니다.
매일 자정에 만료일이 지난 CANCELED, PAYMENT_FAILED 상태의 구독을 찾아 EXPIRED 상태로 변경하여 데이터 정합성을 유지합니다.

테스트 코드 보강
위에 추가된 모든 핵심 로직에 대해 단위 테스트, 리포지토리 테스트, 통합 테스트를 작성하여 코드의 신뢰성을 확보했습니다.

이미지 첨부


다음 할 일

  • 다음으로 할 일을 작성해 주세요.

정기 결제 스케줄러 추가 (SubscriptionScheduler, SubscriptionBillingService)
- 매일 새벽 4시에 만료 예정인 구독을 자동으로 갱신하고 결제하는 스케줄러를 추가했습니다.
- PortOne의 빌링키 결제 API(payWithBillingKey)를 사용하여 자동 결제를 구현했습니다.
- 결제 성공 및 실패 시 Order 내역을 기록하고, 성공 시 구독 기간을 연장합니다.

구독 취소 기능 구현 (PaymentController, PaymentService)
- 사용자가 구독을 취소할 수 있는 API 엔드포인트를 추가했습니다.
- PortOne의 결제 취소 API(cancelPayment)를 연동하여 다음 정기 결제 대상에서 제외됩니다.
- 구독 취소 시 Subscription의 상태를 CANCELED로 변경하고, Order 상태를 업데이트합니다.

구독 모델(Subscription) 개선
- 자동 갱신(autoRenew) 플래그 추가: 사용자가 "다음 결제 취소"를 선택할 경우, 남은 기간은 서비스를 이용하되 다음 결제는 일어나지 않도록 autoRenew 플래그로 관리합니다. 스케줄러는 이 플래그가 true인 구독만 갱신합니다.
- 말일 처리 로직 추가: 신규 구독 또는 갱신 시점이 월의 마지막 날(30일, 31일, 28일 등)일 경우, 다음 만료일도 다음 달의 마지막 날로 정확하게 설정되도록 로직을 개선했습니다.

PortOne 웹훅 처리 개선 (PaymentWebhookRequest)
- PortOne에서 오는 다양한 웹훅(Transaction.*, BillingKey.*)을 유연하게 처리할 수 있도록 PaymentWebhookRequest DTO를 JsonNode를 사용하도록 리팩토링했습니다.
- 서비스 계층의 비즈니스 로직을 도메인 엔티티로 이동
- Order/Subscription에 팩토리 메서드 및 비즈니스 메서드 추가
- Order.createForSubscription() 정적 팩토리 메서드 도입
- SubscriptionBillingService에서 일관된 Order 생성 로직 사용
- 구독 만료에 대한 스케줄러 처리
- 각 테스트 코드 재작성 및 코드 검증
@DongHyeonka DongHyeonka self-assigned this Jul 29, 2025
@DongHyeonka DongHyeonka merged commit f65ebe1 into Synapsesa:develop Jul 29, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant