[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 — interface save(...).
  • domain/partner/audit/PartnerAuditLogCustomRepository.kt — interface findBy(partnerId, from, to, pageable): Page<PartnerAuditLog>.
  • domain/partner/gateway/PartnerActivityRecorder.kt — interface record(partnerId, userId, method, path, statusCode, latencyMs, ipAddr?, userAgent?, calledAt).
  • domain/partner/audit/PartnerAuditLogDomainService.ktrecord(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은 호출 시각 전후 범위 안에 있다(시간 인자 미전달, 내부 해결).