반응형
01. [핵심관심모듈]
ExecutionTimeBean
package xyz.itwill07.aop;
public class ExecutionTimeBean {
//1.
public void one() {
//System.currentTimeMillis() : 시스템의 현재 날짜와 시간에 대한 타임스탬프를 반환하는 메소드
//타임스탬프(TimeStamp) : 날짜와 시간을 정수값으로 변환한 값 - 날짜와 시간에 대한 연산이 목적
//long startTime = System.currentTimeMillis();
long count=0;
for(long i=1; i<=10_000_000_000L; i++) {
count++;
}
System.out.println("count = "+count);
//long endTime = System.currentTimeMillis();
//System.out.println("ExecutionTimeBean 클래스의 one 메소드 실행 시간 = "
// +(endTime-startTime)+"ms" );
}
//2.
public void two() {
//long startTime = System.currentTimeMillis();
long count=0;
for(long i=1; i<=20_000_000_000L; i++) {
count++;
}
System.out.println("count = "+count);
//long endTime = System.currentTimeMillis();
//System.out.println("ExecutionTimeBean 클래스의 two 메소드 실행 시간 = "+(endTime-startTime)+"ms" );
}
}
02. [횡단관심모듈] : Advice클래스
ExecutionTimeAdvice
package xyz.itwill07.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.util.StopWatch;
public class ExecutionTimeAdvice {
//타겟메소드의 명령이 실행되는 처리시간을 계산하여 기록하기 위한 메소드 - Around Advice Method
public Object timeWatchLog(ProceedingJoinPoint joinPoint) throws Throwable {
//타겟메소드의 명령이 싱행되는 처리시간을 계산하여 출력하기 위한 메소드 - Around Advice Method
public Object timeWatchLog(ProceedingJoinPoint joinPoint) throws Throwable {
/*
//타겟메소드의 명령 실행전에 동작될 명령 작성
long startTime=System.currentTimeMillis();
//타겟메소드 호출하여 명령 실행
Object object=joinPoint.proceed();
//타겟메소드의 명령 실행후에 동작될 명령 작성
long endTime=System.currentTimeMillis();
System.out.println(className+" 클래스의 "+methodName+" 메소드 실행 시간 = "+(endTime-startTime)+"ms");
return object;
*/
//StopWatch 객체 : 시간을 측정하기 위한 기능을 제공하기 위한 객체
StopWatch stopWatch=new StopWatch();
//StopWatch.start() : 시간 측정을 시작하는 메소드
stopWatch.start();
//타겟메소드 호출하여 명령 실행
Object object=joinPoint.proceed();
//StopWatch.stop() : 시간 측정을 종료하는 메소드
stopWatch.stop();
String className = joinPoint.getTarget().getClass().getSimpleName();
String methodName = joinPoint.getSignature().getName();
//System.out.println(className+" 클래스의 "+methodName+" 메소드 실행 시간 = "+(endTime-startTime)+"ms" );
//StopWatch.getTotalTimeMillis() : 측정된 시간을 ms 단위로 반환하는 메소드
System.out.println(className+" 클래스의 "+methodName+" 메소드 실행 시간 = "+stopWatch.getTotalTimeMillis()+"ms" );
//System.out.println(className+" 클래스의 "+methodName+" 메소드 실행 시간 = "+stopWatch.getTotalTimeNanos()+"nm" );
//System.out.println(className+" 클래스의 "+methodName+" 메소드 실행 시간 = "+stopWatch.getTotalTimeSeconds()+"s" );
return object;
}
}
03. 💖Spring Bean Configuration File
[07-3_timer.xml]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="<http://www.springframework.org/schema/beans>"
xmlns:xsi="<http://www.w3.org/2001/XMLSchema-instance>"
xmlns:aop="<http://www.springframework.org/schema/aop>"
xsi:schemaLocation="<http://www.springframework.org/schema/beans> <http://www.springframework.org/schema/beans/spring-beans.xsd>
<http://www.springframework.org/schema/aop> <http://www.springframework.org/schema/aop/spring-aop.xsd>">
<!-- Spring Bean 등록 -->
<bean class="xyz.itwill07.aop.ExecutionTimeBean" id="executionTimeBean"/>
<bean class="xyz.itwill07.aop.ExecutionTimeAdvice" id="executionTimeAdvice"/>
<!-- Advice 클래스 설정-->
<aop:config>
<aop:aspect ref="executionTimeAdvice">
<!-- JoinPoint & pointCut 설정-->
<!-- JoinPoint: 타겟메소드 실행전과 후에, pointCut: 타겟메소드 = ExecutionTimeBean클래스안에 모든 메소드 -->
<!-- <aop:around method="timeWatchLog" pointcut="execution(void xyz.itwill07.aop.ExecutionTimeBean.*(..))"/> -->
<aop:around method="timeWatchLog" pointcut="within(xyz.itwill07.aop.ExecutionTimeBean)"/>
</aop:aspect>
</aop:config>
</beans>
04. 실행프로그램
ExecutionTimeApp
package xyz.itwill07.aop;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ExecutionTimeApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("07-3_timer.xml");
ExecutionTimeBean bean = context.getBean("executionTimeBean",ExecutionTimeBean.class);
System.out.println("======================================================");
bean.one();
System.out.println("======================================================");
bean.two();
System.out.println("======================================================");
((ClassPathXmlApplicationContext)context).close();
}
}
반응형
'framework > spring AOP(관점지향)' 카테고리의 다른 글
[springAOP] 8. 어노테이션기반의 AOP 만들어 사용하기 | Advisor 클래스 (0) | 2024.07.31 |
---|---|
[springAOP] 7. 스키마기반의 AOP 만들어 사용하기 | EmailSendApp프로그램 (0) | 2024.07.31 |
[springAOP] 5. 스키마기반의 AOP 만들어 사용하기 | Advice클래스의 매개변수 (0) | 2024.07.31 |
[springAOP] 4. 스키마기반의 AOP 만들어 사용하기 | Advice클래스 (0) | 2024.07.30 |
[springAOP] 3. AOP 만들기 전 설정할 것 (0) | 2024.07.30 |