[BE-02] partner 감사 도메인 모델 (PartnerAuditLog·Recorder interface·DomainService)
작업 내용 (설계 의도)
변경 사항
근거 TDD: ../TDD.md “PartnerAuditLog”·ADR-009. BE-01의 키 로직과 독립(파일 교집합 ∅, partnerId·userId는 Long 참조만) → wave 1 병렬 배치.
domain/partner/audit/PartnerAuditLog.kt— 불변 감사 엔티티. partnerId·userId·httpMethod·requestPath·targetResource?·statusCode·latencyMs·ipAddr?·clientUserAgent?·calledAt. 팩토리of(...).domain/partner/audit/PartnerAuditLogRepository.kt— interfacesave(...).domain/partner/audit/PartnerAuditLogCustomRepository.kt— interfacefindBy(partnerId, from, to, pageable): Page<PartnerAuditLog>.domain/partner/gateway/PartnerActivityRecorder.kt— interfacerecord(partnerId, userId, method, path, statusCode, latencyMs, ipAddr?, userAgent?, calledAt).domain/partner/audit/PartnerAuditLogDomainService.kt—record(auditLog)·listBy(partnerId, from, to, pageable).
의존
- 없음 (선행 wave)
다이어그램
클래스 의존
flowchart LR Log["PartnerAuditLog (Entity)"] Ds["PartnerAuditLogDomainService"] Repo["PartnerAuditLogRepository"] Custom["PartnerAuditLogCustomRepository"] Recorder["PartnerActivityRecorder (interface)"] Ds --> Repo Ds --> Custom Ds --> Log Recorder --> Log
테스트 케이스
- record 호출 시 PartnerAuditLogRepository.save가 1회 호출된다.
- listBy는 from~to 범위·partnerId로 위임 조회한 Page를 반환한다.
- PartnerAuditLog.of는 statusCode·latencyMs 필수값을 그대로 담는다.
- calledAt은 호출 시각 전후 범위 안에 있다(시간 인자 미전달, 내부 해결).