@Retry 애노테이션이 있으면 예외가 발생하면 다시 시도하도록 하겠습니다.
@Retry
package hello.aop.exam.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD) //메소드에 적용
@Retention(RetentionPolicy.RUNTIME)
public @interface Retry {
int value() default 3;
}
이 애노테이션에서 재시도 횟수 기본값을 3으로 지정할수 있습니다.
RetryAspect.java
@Slf4j
@Aspect
public class RetryAspect {
@Around("@annotation(retry)") // 애노테이션이 있는 메소드만 적용
public Object doRetry(ProceedingJoinPoint joinPoint, Retry retry) throws Throwable {
log.info("[retry] {} retry={}", joinPoint.getSignature(), retry);
int maxRetry = retry.value();
Exception exceptionHolder = null;
for (int retryCount = 1; retryCount <= maxRetry; retryCount++) {
try {
log.info("[retry] try count={}/{}", retryCount, maxRetry);
return joinPoint.proceed();
} catch (Exception e) {
exceptionHolder = e;
}
}
throw exceptionHolder;
}
}
- 재시도 하는 애스펙트이다.
- @annotation(retry) , Retry retry 를 사용해서 어드바이스에 애노테이션을 파라미터로 전달한다.
- retry.value() 를 통해서 애노테이션에 지정한 값을 가져올 수 있다.
- 예외가 발생해서 결과가 정상 반환되지 않으면 retry.value() 만큼 재시도한다.
실행 결과 ... [retry] try count=1/5 [retry] try count=2/5 실행 결과를 보면 문제가 발생했을 때 재시도 덕분에 문제가 복구되고, 정상 응답되는 것을 확인할 수 있다.
'프레임워크 > 스프링' 카테고리의 다른 글
[Spring] AOP 프록시와 내부 호출 문제 해결 방안 3가지 (0) | 2023.01.22 |
---|---|
스프링 xml 설정 정리 (0) | 2023.01.17 |
@RequestParam vs @PathVariable (0) | 2022.12.29 |
Spring @Aspect를 사용하여 어드바이저 생성 기능 사용 (0) | 2022.12.24 |
스프링이 지원하는 프록시 (0) | 2022.12.11 |