실전에서 사용하는 AOP적용법을 간단하게 알아보자
EX 예외터지면 해당함수를 일정 횟수 반복하는 AOP
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Retry {
int value() default 3;
}
@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;
}
}
@Aspect
를 만들어준다.@Repository
public class ExamRepository {
@Trace
@Retry(value = 4)
public String save(String itemId) {
//...
}
}
@SpringBootTest
@Import({TraceAspect.class, RetryAspect.class}) //TraceAspect.class이건 또다른 예시임
public class ExamTest {
}
Bean등록을 까먹지않는다.
사용해주면 끝
이런식으로 어노테이션형식으로 @Aspect
만 만들어준후 가져다 붙이고 Bean으로 등록만하면 끝이다.