fix(calculate): 콘텐츠 후원 정산 비율을 70퍼센트로 통일한다

This commit is contained in:
2026-03-05 11:47:55 +09:00
parent 1fbad0f2bb
commit 07f8d22024
2 changed files with 29 additions and 14 deletions

View File

@@ -0,0 +1,16 @@
- [x] `getCalculateContentDonationList` 호출 경로(Controller → Service → QueryData) 확인
- [x] 유료/무료 콘텐츠 후원 정산 비율이 모두 70%로 적용되는지 검증
- [x] `GetCalculateContentDonationQueryData` 계산 로직의 불필요 분기/중복 제거 및 가독성 개선
- [x] 관련 테스트/빌드/정적 진단 실행 및 결과 확인
---
## 검증 기록
### 1차 구현
- 무엇을: `GetCalculateContentDonationQueryData`에서 유료/무료 공통 정산 비율 70% 적용 상태를 확인하고, 정산 계산 상수(`KRW_PER_CAN`, `PAYMENT_FEE_RATE`, `SETTLEMENT_RATE`, `TAX_RATE`)를 `companion object`로 추출해 계산 로직을 정리했다.
- 왜: 유료/무료 분기 제거 후 동일 70% 정책을 명확히 유지하고, `BigDecimal` 상수 재사용으로 계산 의도와 유지보수성을 높이기 위해서다.
- 어떻게: 호출 경로(`AdminCalculateController``AdminCalculateService``AdminCalculateQueryRepository``GetCalculateContentDonationQueryData`)를 확인했고, 정적 진단은 `.kt` LSP 미구성으로 대체 검증했다. 실행 명령과 결과는 아래와 같다.
- `lsp_diagnostics` (`GetCalculateContentDonationQueryData.kt`): Kotlin LSP 미지원으로 실행 불가(환경 제약 확인)
- `./gradlew test`: 성공 (`BUILD SUCCESSFUL`)
- `./gradlew build`: 성공 (`BUILD SUCCESSFUL`, `ktlintMainSourceSetCheck` 포함)

View File

@@ -20,33 +20,32 @@ data class GetCalculateContentDonationQueryData @QueryProjection constructor(
// 합계 // 합계
val totalCan: Int val totalCan: Int
) { ) {
companion object {
private val KRW_PER_CAN = BigDecimal("100")
private val PAYMENT_FEE_RATE = BigDecimal("0.066")
private val SETTLEMENT_RATE = BigDecimal("0.7")
private val TAX_RATE = BigDecimal("0.033")
}
fun toGetCalculateContentDonationResponse(): GetCalculateContentDonationResponse { fun toGetCalculateContentDonationResponse(): GetCalculateContentDonationResponse {
// 원화 = totalCoin * 100 ( 캔 1개 = 100원 ) // 원화 = totalCoin * 100 ( 캔 1개 = 100원 )
val totalKrw = BigDecimal(totalCan).multiply(BigDecimal(100)) val totalKrw = BigDecimal(totalCan).multiply(KRW_PER_CAN)
// 결제수수료 : 6.6% // 결제수수료 : 6.6%
val paymentFee = totalKrw.multiply(BigDecimal(0.066)) val paymentFee = totalKrw.multiply(PAYMENT_FEE_RATE)
// 정산금액 // 정산금액
// 유료콘텐츠 (원화 - 결제수수료) 의 90% // 유료콘텐츠 (원화 - 결제수수료) 의 70%
// 무료콘텐츠 (원화 - 결제수수료) 의 70% // 무료콘텐츠 (원화 - 결제수수료) 의 70%
val settlementAmount = if (price > 0) { val settlementAmount = totalKrw.subtract(paymentFee).multiply(SETTLEMENT_RATE)
totalKrw.subtract(paymentFee).multiply(BigDecimal(0.9))
} else {
totalKrw.subtract(paymentFee).multiply(BigDecimal(0.7))
}
// 원천세 = 정산금액의 3.3% // 원천세 = 정산금액의 3.3%
val tax = settlementAmount.multiply(BigDecimal(0.033)) val tax = settlementAmount.multiply(TAX_RATE)
// 입금액 // 입금액
val depositAmount = settlementAmount.subtract(tax) val depositAmount = settlementAmount.subtract(tax)
val paidOrFree = if (price > 0) { val paidOrFree = if (price > 0) "유료" else "무료"
"유료"
} else {
"무료"
}
return GetCalculateContentDonationResponse( return GetCalculateContentDonationResponse(
nickname = nickname, nickname = nickname,