본문 바로가기

카테고리 없음

[Java/Spring] Advice Annotation 동작

반응형
제가 참고하기 위해 정리한 글이라서 보기에 어려움이 있을 수 있습니다.

 

[ 내부 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;
	}

}

 

 

반응형