✨ 구현 할 기능
이메일 발송 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 내부에 직접 정의.
📑 기능 명세
📕 래퍼런스
- 기존 AOP 패턴:
src/main/java/com/recyclestudy/common/trace/TracingAspect.java
- 기존 Pointcut 정의:
src/main/java/com/recyclestudy/common/log/LoggingPointcuts.java
✨ 구현 할 기능
이메일 발송 Micrometer 카운터 3개를 AOP Aspect로 구현한다.
email.send.failedemail.retry.successemail.retry.abandoned📢 구현 방식
재시도 구분 방법
현재
sendOne()이 최초 발송(ReviewEmailSender)과 재시도(EmailRetryService) 양쪽에서 호출된다.@Async환경에서 콜 스택으로 호출자를 구분할 수 없으므로sendOne(ReviewSendElement element, boolean isRetry)파라미터를 추가해 호출자가 명시적으로 전달한다.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 구조
기존
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)📕 래퍼런스
src/main/java/com/recyclestudy/common/trace/TracingAspect.javasrc/main/java/com/recyclestudy/common/log/LoggingPointcuts.java