본문 바로가기
프레임워크/스프링

Spring @Aspect 범위 애노테이션으로 적용하기

by so5663 2023. 1. 6.

 

@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 실행 결과를 보면 문제가 발생했을 때 재시도 덕분에 문제가 복구되고, 정상 응답되는 것을 확인할 수 있다.