Spring AOP에 관하여 마지막 포스팅 인 것 같습니다.. 길고 먼 길이었네요..
우선 이전 포스팅 링크입니다 :)
[Java/Spring-framework] - Spring Framework Documentation - Spring AOP / Example -2
이번 포스팅에서는, Introduction 과 AOP의 예제들을 보도록 하겠습니다!
AOP Mechanism - Introductions
Introductions은 proxy객체에 메소드나 필드를 추가한 것이라고 위에서 설명 했듯이, 주어진 인터페이스를 대신 구현하고 제공합니다.
@Aspect
public class UsageTracking {
@DeclareParents(value="com.xzy.myapp.service.*+", defaultImpl=DefaultUsageTracked.class)
public static UsageTracked mixin;
@Before("com.xyz.myapp.SystemArchitecture.businessService() && this(usageTracked)")
public void recordUsage(UsageTracked usageTracked) {
usageTracked.incrementUseCount();
}
}
AOP Mechanism - AOP Schema Example
다음은 Spring Documentation의 예제입니다.
@Aspect
public class ConcurrentOperationExecutor implements Ordered {
private static final int DEFAULT_MAX_RETRIES = 2;
private int maxRetries = DEFAULT_MAX_RETRIES;
private int order = 1;
public void setMaxRetries(int maxRetries) {
this.maxRetries = maxRetries;
}
public int getOrder() {
return this.order;
}
public void setOrder(int order) {
this.order = order;
}
@Around("com.xyz.myapp.SystemArchitecture.businessService()")
public Object doConcurrentOperation(ProceedingJoinPoint pjp) throws Throwable {
int numAttempts = 0;
PessimisticLockingFailureException lockFailureException;
do {
numAttempts++;
try {
return pjp.proceed();
}
catch(PessimisticLockingFailureException ex) {
lockFailureException = ex;
}
} while(numAttempts <= this.maxRetries);
throw lockFailureException;
}
}
- Aspect는 Ordered 인터페이스를 implements하여 우선순위를 설정 할 수 있습니다. 여기서 maxRetries, order는 Spring에 의해 구성되게 됩니다.
- 위의 코드에서 주된 부분은 Object doConcurrentOperation입니다. (@Around)
- 어노테이션 내에 적혀있는 businessService에 적용이 되는 것을 알 수 있습니다.
AOP Mechanism - Spring AOP 적용과 프로젝트에서의 사용
다음은 성능 진단 시간체크 Aspect 예제입니다.
package foo;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.util.StopWatch;
import org.springframework.core.annotation.Order;
@Aspect
public class ProfilingAspect {
@Around("methodsToBeProfiled()")
public Object profile(ProceedingJoinPoint pjp) throws Throwable {
StopWatch sw = new StopWatch(getClass().getSimpleName());
try {
sw.start(pjp.getSignature().getName());
return pjp.proceed();
} finally {
sw.stop();
System.out.println(sw.prettyPrint());
}
}
@Pointcut("execution(public * foo..*.*(..))")
public void methodsToBeProfiled(){}
}
위의 예제는 모든 foo 패키지의 메서드 들에 대해서 profile advice가 동작하며 시간을 체크합니다.
다음은, AOP가 사용되는 실제 사례입니다.
- 로깅의 예
@Aspect
public class LoggingAspect {
private static final Logger logger = LoggerFactory.getLogger(MessageAdvice.class);
@Before("methodsToBeLogging()")
public Object profile(ProceedingJoinPoint jp) throws Throwable {
logger.info("메서드 :"+jp.getSignature().getName());
logger.info("매개변수 :"+Arrays.toString(jp.getArgs());
}
@Pointcut("execution(public * foo..*.*(..))")
public void methodsToBeLogging(){}
}
- 에러처리의 예
@Aspect
public class ErrorHandlingAspect {
@Around("methodsToBeErrorHandling()")
public Object profile(ProceedingJoinPoint jp) throws Throwable {
try {
result = jp.proceed();
} catch (Throwable e) {
logger.error("[" + jp.toString() + "]*" + e);
//errorHandling ...
}
}
@Pointcut("execution(public * foo..*.*(..))")
public void methodsToBeErrorHandling(){}
}
Spring AOP에 관한 길고 긴 포스팅이었습니다.. 고생하셨어요~!!
스프링의 길은 멀고도 험난한 것 같아요.... 좀더 자세히 쉽게 정리 할 수 있는 날이 오기를....
'Old Branch' 카테고리의 다른 글
Python Basic - 가상환경 virtualenv(1) (0) | 2019.06.24 |
---|---|
Spring Framework Documentation - Spring AOP / Example -2 (0) | 2019.06.22 |
Spring Framework Documentation - Spring AOP / Example -1 (0) | 2019.06.21 |
Python Basic - print 출력하기 (0) | 2019.06.19 |
Python Basic - 설치 (0) | 2019.06.19 |