본문 바로가기

프레임워크/Spring

[프레임워크] <Spring>〈Maven〉Advice 동작 시점

동작 시점

◎ aspect(위빙) 설정할 때 함께 설정한다.


시점 종류

before 비즈니스 메서드 수행 전
after 유사 finally
비즈니스 메서드 수행 후
after-returning  비즈니스 메서드 return 반환 후
after-throwing  유사 catch
 비즈니스 메서드 예외 발생 시
around  비즈니스 메서드 수행 전후로 접근가능
 핵심로직의 성능평가

 


AfterReturningAdvice

◎ bean 설정

<bean class="com.spring.biz.common.AfterReturningAdvice" id="ara" />
<aop:config>
	<aop:pointcut id="aPointcut" expression="execution(* com.spring.biz..*Impl.*(..))" />
	<aop:pointcut id="bPointcut" expression="execution(* com.spring.biz..*Impl.select*(..))" />
    	<aop:aspect ref="ara">
        	<aop:after-returning pointcut-ref="bPointcut" method="afterReturningPrintLog" />
      	</aop:aspect>
</aop:config>

 

◎ Service 코드

public class AfterReturningAdvice {
	public void afterReturningPrintLog() {
		System.out.println("     로그 02 비즈니스 메서드 수행 후에 로그를 출력합니다.");
	}
}

AfterThrowingAdvice

◎ bean 설정

<bean class="com.spring.biz.common.AfterThrowingAdvice" id="ata" />
<aop:config>  
	<aop:pointcut id="aPointcut" expression="execution(* com.spring.biz..*Impl.*(..))" /> 
	<aop:pointcut id="bPointcut" expression="execution(* com.spring.biz..*Impl.select*(..))" />
	<aop:aspect ref="ata">
		<aop:after-throwing pointcut-ref="aPointcut" method="printException" />
	</aop:aspect>
</aop:config>

 

◎ Service 코드

public class AfterThrowingAdvice {
	public void printException() {
		System.out.println("     로그 03 예외 발생");
	}
}

AroundAdvice

◎ bean 설정

<bean class="com.spring.biz.common.AroundAdvice" id="aa" />
<aop:config>	   
	<aop:pointcut id="aPointcut" expression="execution(* com.spring.biz..*Impl.*(..))" />  
	<aop:pointcut id="bPointcut" expression="execution(* com.spring.biz..*Impl.select*(..))" />
	<aop:aspect ref="aa">
		<aop:around pointcut-ref="aPointcut" method="aroundPrintLog" />
	</aop:aspect>
</aop:config>

 

◎ Service 코드

public class AroundAdvice {
	public Object aroundPrintLog(ProceedingJoinPoint pjp) throws Throwable {
		String methodName=pjp.getSignature().getName();
        
		System.out.println("[BEFORE]");
        
		StopWatch sw=new StopWatch();
		sw.start();
	
		Object obj=pjp.proceed();
		// 비즈니스 메서드가 수행됨
		
		sw.stop();
		
		System.out.println("[AFTER]");
		System.out.println("비즈니스 메서드 : "+methodName);
		System.out.println("수행하는데에 걸린시간 : "+sw.getTotalTimeMillis()+"(ms)초");
		
		return obj;
	}
}