[BE-04] partner audit persistence infra (Repository·QueryDSL·Async Recorder·전용 Executor)

작업 내용 (설계 의도)

변경 사항

근거 TDD: ../TDD.md·ADR-009. BE-02 감사 interface의 infrastructure 구현 + 비동기 적재.

  • infrastructure/partner/audit/PartnerAuditLogJpaRepository.kt·PartnerAuditLogRepositoryImpl.kt — save.
  • infrastructure/partner/audit/PartnerAuditLogQueryDslRepository.kt(Custom 구현) — findBy(partnerId, from, to, pageable) 범위 조회. @Query 금지, QueryDSL.
  • infrastructure/partner/audit/AsyncPartnerActivityRecorder.ktPartnerActivityRecorder 구현, @Async("partnerAuditExecutor"), PartnerAuditLogDomainService.record 호출, 실패 시 요청 비실패·WARN 로그(mcp McpAuditLogAsyncRecorder 패턴).
  • infrastructure/config/PartnerAsyncConfig.kt신규 파일partnerAuditExecutor 빈 정의. 기존 AsyncConfig.kt 수정 금지(Single Writer 보호).

의존

  • BE-02

다이어그램

처리 흐름

sequenceDiagram
    participant F as Filter(BE-08)
    participant R as AsyncPartnerActivityRecorder
    participant D as PartnerAuditLogDomainService
    F->>R: record(...) @Async
    R->>D: record(auditLog)
    Note over R: 실패 시 WARN, 요청 비실패

테스트 케이스

  • record 호출 시 partner_audit_log에 1건 적재된다 (TestContainers).
  • DomainService가 예외를 던져도 record는 예외를 전파하지 않고 WARN 로그만 남긴다.
  • findBy는 from~to 범위 밖 로그를 제외하고 called_at DESC로 페이징한다.
  • 신규 파트너의 findBy는 빈 Page를 반환한다.