diff --git a/docs/20260305_콘텐츠후원정산70퍼센트검증및최적화.md b/docs/20260305_콘텐츠후원정산70퍼센트검증및최적화.md new file mode 100644 index 00000000..2dd2f624 --- /dev/null +++ b/docs/20260305_콘텐츠후원정산70퍼센트검증및최적화.md @@ -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` 포함) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateContentDonationQueryData.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateContentDonationQueryData.kt index 22651a87..48d9a6e0 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateContentDonationQueryData.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateContentDonationQueryData.kt @@ -20,33 +20,32 @@ data class GetCalculateContentDonationQueryData @QueryProjection constructor( // 합계 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 { // 원화 = totalCoin * 100 ( 캔 1개 = 100원 ) - val totalKrw = BigDecimal(totalCan).multiply(BigDecimal(100)) + val totalKrw = BigDecimal(totalCan).multiply(KRW_PER_CAN) // 결제수수료 : 6.6% - val paymentFee = totalKrw.multiply(BigDecimal(0.066)) + val paymentFee = totalKrw.multiply(PAYMENT_FEE_RATE) // 정산금액 - // 유료콘텐츠 (원화 - 결제수수료) 의 90% + // 유료콘텐츠 (원화 - 결제수수료) 의 70% // 무료콘텐츠 (원화 - 결제수수료) 의 70% - val settlementAmount = if (price > 0) { - totalKrw.subtract(paymentFee).multiply(BigDecimal(0.9)) - } else { - totalKrw.subtract(paymentFee).multiply(BigDecimal(0.7)) - } + val settlementAmount = totalKrw.subtract(paymentFee).multiply(SETTLEMENT_RATE) // 원천세 = 정산금액의 3.3% - val tax = settlementAmount.multiply(BigDecimal(0.033)) + val tax = settlementAmount.multiply(TAX_RATE) // 입금액 val depositAmount = settlementAmount.subtract(tax) - val paidOrFree = if (price > 0) { - "유료" - } else { - "무료" - } + val paidOrFree = if (price > 0) "유료" else "무료" return GetCalculateContentDonationResponse( nickname = nickname,