Old Branch

Spring Framework Documentation - Spring AOP / Example -3

woolbro 2019. 6. 22. 11:10
반응형

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에 관한 길고 긴 포스팅이었습니다.. 고생하셨어요~!! 

 

 

스프링의 길은 멀고도 험난한 것 같아요.... 좀더 자세히 쉽게 정리 할 수 있는 날이 오기를....