Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
8.4 KiB
8.4 KiB
-
변수명 확정: 엔티티 내부 추가 변수는
AudioContent.settlementRatio: Int?로 사용한다.- 이유:
AudioContent는 이미 콘텐츠 도메인 엔티티이므로contentSettlementRatio는 중복 표현에 가깝다. - 근거: 이 저장소의 엔티티 필드는
AudioContent.price,LiveRoom.price,CreatorCommunity.price처럼 엔티티 스코프 안에서는 도메인 접두어를 반복하지 않는다. - 예외 기준:
CreatorSettlementRatio.contentSettlementRatio처럼 하나의 엔티티 안에서live/content/community여러 정산 대상을 함께 구분해야 할 때만content접두어가 필요하다. - DTO/API 정책: 해당 값은 관리자에서만 사용하므로 관리자 요청/응답 DTO와 API 필드명도 예외 없이
settlementRatio로 통일한다. - nullable 정책: 기존 데이터와 크리에이터 정산 요율 미등록 케이스를 안전하게 수용하기 위해 초기 도입 시
Int?로 두고, 계산 시콘텐츠별 요율 -> 크리에이터 기본 요율 -> 70% 기본값순서로 fallback 하도록 설계한다.
- 이유:
-
AudioContent엔티티에 콘텐츠별 정산 요율 필드를 추가한다.- 대상 파일:
src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContent.kt - 작업 내용:
price인접 위치에settlementRatio: Int?필드를 추가하고, 기존 생성자 호출부가 모두 컴파일되도록 생성 경로를 함께 정리한다.
- 대상 파일:
-
관리자 콘텐츠 목록 조회 응답에 콘텐츠별 정산 요율을 노출한다.
- 대상 파일:
src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentRepository.kt,src/main/kotlin/kr/co/vividnext/sodalive/admin/content/GetAdminContentListResponse.kt,src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentService.kt - 작업 내용:
QGetAdminContentListItem(...)QueryProjection에audioContent.settlementRatio를 추가한다.GetAdminContentListItem에settlementRatio: Int?를 추가하고, 관리자 목록 응답 필드명도 동일하게settlementRatio로 맞춘다.AdminContentController.getAudioContentList응답에 정산 요율이 함께 내려가도록 조회 체인을 맞춘다.
- 대상 파일:
-
관리자 콘텐츠 수정 API에서 콘텐츠별 정산 요율을 수정할 수 있게 한다.
- 대상 파일:
src/main/kotlin/kr/co/vividnext/sodalive/admin/content/UpdateAdminContentRequest.kt,src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentService.kt - 작업 내용:
UpdateAdminContentRequest에settlementRatio: Int?를 추가하고, 관리자 수정 요청 필드명도 동일하게settlementRatio로 맞춘다.AdminContentService.updateAudioContent에서 요청값이 들어오면audioContent.settlementRatio를 갱신한다.- 숫자 범위 정책은
0~100으로 검증한다. - 개별 콘텐츠 정산 요율 삭제는
isSettlementRatioDeleted: true플래그로만 처리하고,settlementRatio와 동시 전달 시 invalid request 로 처리한다.
- 대상 파일:
-
실제 콘텐츠 정산 계산이 크리에이터 기본 요율이 아니라 콘텐츠별 요율을 우선 사용하도록 변경한다.
- 대상 파일:
src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateQueryRepository.kt,src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateQueryRepository.kt,src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateContentQueryData.kt - 작업 내용:
- 콘텐츠 판매/누적 판매 집계 쿼리에서
creatorSettlementRatio.contentSettlementRatio직접 사용 부분을 점검한다. - 정산 대상 비율은
audioContent.settlementRatio를 우선 사용하고, 값이 없을 때만creatorSettlementRatio.contentSettlementRatio를 fallback 하도록 쿼리 또는 계산 DTO를 조정한다. - 현재
GetCalculateContentQueryData의 70% 기본값 정책은 마지막 fallback 으로 유지한다.
- 콘텐츠 판매/누적 판매 집계 쿼리에서
- 대상 파일:
-
크리에이터 관리자 정산 조회도 동일 기준을 사용하도록 맞춘다.
- 대상 파일:
src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateQueryRepository.kt - 작업 내용: 관리자 정산 조회와 동일하게 콘텐츠별 정산 요율 우선 정책을 반영해 관리자/크리에이터 화면 간 계산 기준이 달라지지 않게 한다.
- 대상 파일:
-
기존 데이터 처리 정책을 정리한다.
- 대상 범위: 운영 DB 스키마/기존 콘텐츠 데이터
- 작업 내용:
- 신규 컬럼 추가 시 nullable 로 도입하고, DDL은
docs/20260407_audio_content_settlement_ratio_ddl.sql기준으로 관리한다. - 콘텐츠 등록 시 크리에이터 기본 정산 요율을 복사하지 않고,
NULL상태에서도 계산이 가능하도록 fallback 순서를 유지한다. - 운영 정책상 기존 콘텐츠에도 즉시 고정값이 필요하면 별도 SQL 또는 배치 백필 계획을 추가로 작성한다.
- 신규 컬럼 추가 시 nullable 로 도입하고, DDL은
-
영향 DTO/Q 클래스/컴파일 산출물을 재생성하고 검증한다.
- 작업 내용:
- QueryDSL projection 변경 후 Q 클래스 재생성이 필요한지 확인하고 빌드로 반영한다.
- 엔티티/관리자 DTO/API/QueryProjection 필드명이 모두
settlementRatio로 일치하는지 확인해 매핑 누락 가능성을 제거한다.
- 작업 내용:
-
검증을 단계별로 수행한다.
- 작업 내용:
AdminContentController.getAudioContentList에서 정산 요율 조회 포함 여부를 확인한다.AdminContentController.modifyAudioContent에서 정산 요율 수정 반영 여부를 확인한다.AdminContentController.modifyAudioContent에서isSettlementRatioDeleted = true요청 시 개별 콘텐츠 정산 요율이 삭제되는지 확인한다.- 콘텐츠 등록 시
settlementRatio가 nullable 상태로 유지되어도 계산 fallback 이 정상 동작하는지 확인한다. - 콘텐츠 정산 조회(
AdminCalculateQueryRepository,CreatorAdminCalculateQueryRepository)가 콘텐츠별 요율을 우선 적용하는지 확인한다. - 실행 검증은 최소
./gradlew build, 필요 시./gradlew test까지 수행한다.
- 작업 내용:
1차 구현 검증 기록
- 무엇을:
AudioContent.settlementRationullable 컬럼 추가, 관리자 목록/수정 API 반영, 콘텐츠/누적 정산 쿼리의 콘텐츠별 요율 우선 fallback 반영, 생성 시 기본 요율 복사 제거. - 왜: 기존 콘텐츠와 미설정 콘텐츠를
NULL로 유지하면서도 관리자에서 개별 요율을 조회/수정하고 정산 시 올바른 fallback 순서를 적용하기 위해. - 어떻게:
./gradlew build→ 성공./gradlew test→build과정에 포함되어 성공- 관리자/정산 API의 실서버 수동 호출 검증 → 이 로컬 작업 세션에서는 애플리케이션 실행 및 인증 가능한 테스트 데이터가 없어 미실행
2차 수정 검증 기록
- 무엇을:
@SpringBootTest없이 콘텐츠 정산 계산 DTO의 명시 비율 적용과null -> 70% fallback을 검증하는 순수 단위 테스트를 추가했다. - 왜: 정산 쿼리 변경만으로는 계산 결과가 코드상에서 충분히 고정되지 않아, 문서에 적힌 계산 규칙을 재현 가능한 테스트로 보장하기 위해.
- 어떻게:
./gradlew test --tests kr.co.vividnext.sodalive.admin.calculate.ContentSettlementCalculationTest→ 성공- 검증 대상:
GetCalculateContentQueryData,GetCumulativeSalesByContentQueryData - 검증 시나리오:
settlementRatio = 80적용,settlementRatio = null시 70% fallback 적용
3차 수정 검증 기록
- 무엇을: 관리자 콘텐츠 수정 API의 개별 콘텐츠 정산 요율 삭제 방식을 명시적 null 대신
isSettlementRatioDeleted플래그로 전환한다. - 왜: 부분 업데이트 요청에서 필드 생략과 null 삭제 의미가 섞이지 않도록 API 계약을 명확히 하기 위해.
- 어떻게:
./gradlew test --tests kr.co.vividnext.sodalive.admin.content.AdminContentServiceTest→ 성공./gradlew test --tests kr.co.vividnext.sodalive.admin.calculate.ContentSettlementCalculationTest→ 성공./gradlew build→ 성공- 검증 시나리오: 유효한 요율 설정, 삭제 플래그 삭제, 값/삭제 플래그 동시 전달 충돌,
null키/삭제 플래그 동시 전달 충돌, 범위 초과 거부, 정산 fallback 회귀 확인