Skip to content

이메일 발송 Micrometer 카운터 AOP 구현 #87

Description

@jhan0121

✨ 구현 할 기능

이메일 발송 Micrometer 카운터 3개를 AOP Aspect로 구현한다.

카운터 증가 시점
email.send.failed 발송 실패 (Exception 발생)
email.retry.success 재시도 발송 성공
email.retry.abandoned deadline 초과로 재시도 포기

📢 구현 방식

재시도 구분 방법

현재 sendOne()이 최초 발송(ReviewEmailSender)과 재시도(EmailRetryService) 양쪽에서 호출된다.
@Async 환경에서 콜 스택으로 호출자를 구분할 수 없으므로
sendOne(ReviewSendElement element, boolean isRetry) 파라미터를 추가해 호출자가 명시적으로 전달한다.

ReviewEmailSender → sendOne(element, false)    // 최초 발송
EmailRetryService → sendOne(element, true)     // 재시도

email.send.failed

sendToTargetEmail() @AfterReturning → 반환값 false 감지 → 카운터 증가

email.retry.success

sendToTargetEmail() @AfterReturning → 반환값 true + isRetry=true 파라미터 조합으로 감지

email.retry.abandoned

포기는 "조회 안 됨"으로 묵시적 처리되어 명시적 포기 시점이 없다.
EmailRetryScheduler.runRetry() @after에서 status=FAILED AND deadline < NOW() 카운트 쿼리를 실행하여 포기 건수를 기록한다.

Aspect 구조

// EmailMetricsAspect.java (신규)
// sendToTargetEmail() @AfterReturning → email.send.failed / email.retry.success
// runRetry() @After → email.retry.abandoned (쿼리로 카운트)

기존 LoggingPointcuts에 email 계층 Pointcut 추가 또는 Aspect 내부에 직접 정의.

📑 기능 명세

  • sendOne(ReviewSendElement element, boolean isRetry) 파라미터 추가
    • ReviewEmailSender: sendOne(element, false) 호출로 변경
    • EmailRetryService: sendOne(element, true) 호출로 변경
  • EmailMetricsAspect.java 신규 생성
    • email.send.failed 카운터
    • email.retry.success 카운터
    • email.retry.abandoned 카운터
  • NotificationHistoryRepository에 포기 건수 조회 쿼리 추가
    • countByStatusAndDeadlineBefore(FAILED, now)

📕 래퍼런스

  • 기존 AOP 패턴: src/main/java/com/recyclestudy/common/trace/TracingAspect.java
  • 기존 Pointcut 정의: src/main/java/com/recyclestudy/common/log/LoggingPointcuts.java

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions