반응형
제가 참고하기 위해 정리한 글이라서 보기에 어려움이 있을 수 있습니다.
[ 내부 Pointcut 참조 ]
applicationContext.xml
<beans>
<context:component-scan base-package="zinc.spring.web"></context:component-scan>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
xml로 advice 설정을 해줘도 되지만 위처럼 오토프록시를 사용해주면 클래스 내부에서 어노테이션으로 활용할 수 있습니다.
LogAdvice.java
package zinc.spring.web.common;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Service;
@Service // bean으로 등록
@Aspect // aspect = advice + pointcut
public class LogAdvice {
@Pointcut("execution(* zinc.spring.web..*Impl.*(..))") // pointcut 메소드
public void allPointcut() {
}
@Pointcut("execution(* zinc.spring.web..*Impl.get*(..))")
public void getPointcut() {
}
@Before("allPointcut()") // advice 지정
public void printLog() {
System.out.println("[공통 로그] : 비즈니스 로직 수행 전 동작" + this.getClass());
}
}
[ 외부 Pointcut 참조 ]
PointcutCommon.java
package zinc.spring.web.common;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class PointcutCommon {
@Pointcut("execution(* zinc.spring.web..*Impl.*(..))")
public void allPointcut() {
}
@Pointcut("execution(* zinc.spring.web..*Impl.get*(..))")
public void getPointcut() {
}
}
LogAdvice.java
package zinc.spring.web.common;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Service;
@Service
@Aspect // aspect = advice + pointcut
public class LogAdvice {
/*
@Pointcut("execution(* zinc.spring.web..*Impl.*(..))")
public void allPointcut() {
}
@Pointcut("execution(* zinc.spring.web..*Impl.get*(..))")
public void getPointcut() {
}
*/
@Before("PointcutCommon.allPointcut()")
public void printLog() {
System.out.println("[공통 로그] : 비즈니스 로직 수행 전 동작" + this.getClass());
}
}
AroundAdvice.java
package zinc.spring.web.common;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Service;
import org.springframework.util.StopWatch;
@Service
@Aspect
public class AroundAdvice {
@Around("PointcutCommon.allPointcut()")
public Object aroundLog(ProceedingJoinPoint joinPoint)throws Throwable{
String method = joinPoint.getSignature().getName();
StopWatch stopWatch = new StopWatch();
stopWatch.start();
Object returnObj = joinPoint.proceed();
// proceed() : 다음 advice 또는 target method 호출을 진행
stopWatch.stop();
System.out.println(method + "() 메서드 수행에 걸린 시간 : " + stopWatch.getTotalTimeMillis() + "(ms)초");
return returnObj;
}
}
반응형