AOP 설정을 활용한 모든 메소드 수행시간 출력
Aop 설정을 활용한 모든 메소드 수행시간 출력
우선 이 설정을 하기 위해선 AOP에 대한 기본적인 지식이 필요합니다.
그것은 아래의 Link를 참고 하도록 합니다.
Link : 전자정부프레임워크 나만의 웹 템플릿 프로젝트 생성하기(4-1) - context-aspect.xml
위의 포스팅을 참고 했다면 아래의 소스에 대한 설명이 이해가 보다 쉬울 것 입니다.
우선 AOP 설정을 사용하는 이유는
필터링된 '모든' Controller의 메소드 대한 수행시간과 해당 메소드 명을 출력할 것이기 때문입니다.
AOP를 사용하지 않는다면 모든 메소드마다 메소드명과 수행시간을 출력하는 클래스를 등록 해 주어야 할 것입니다.
이러한 소스의 낭비를 줄이기 위해 AOP 설정을 활용합니다.
그럼 모든 메소드의 수행시간과 메소드명을 출력하는 클래스를 생성합니다.
- Advice.java
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.util.StopWatch;
public class Advice {
public Object printMethodName(ProceedingJoinPoint pjp) throws Throwable{
String method = pjp.getSignature().getName();
StopWatch stopWatch = new StopWatch();
stopWatch.start();
Object returnObj = pjp.proceed();
stopWatch.stop();
System.out.println("# "+method+"() Method Performance time : "+stopWatch.getTotalTimeMillis()+"(ms)");
return returnObj;
}
}
ProceedingJoinPoint 를 통해 원래 호출하려던 메소드에 대한 정보를 가져올 수 있습니다.
proceed(); 가 그 메소드를 호출하는 곳 입니다.
Object returnObj = pjp.proceed(); 가 없다면 원래 호출하려던 메소드가 실행되지 않고
Object를 리턴하지 않으면 클라이언트로 비지니스 메소드의 실행 결과를 넘겨주지 않아
에러가 발생하게 됩니다.
StopWatch를 시작하고 원래의 메소드를 호출한 후 StopWatch를 정지 함으로써
그 메소드의 수행 시간을 얻을 수 있는 것이죠.
그럼 이 메소드를 모든 controller의 메소드에서 실행되게끔 하는 설정을 하도록 하겠습니다.
이는 *.do 요청 발생 시에 수행되는 구문이기 때문에 *.do에 대한 응답을 하는 Servlet Container의 설정 파일인
dispatcher-servlet.xml 파일에 설정을 추가 하도록 하겠습니다.
dispatcher-servlet.xml 을 열어 아래의 코드를 추가 합니다.
<bean id="printAdvice" class="egovframework.neighbor.cmmn.web.Advice"></bean>
<aop:config>
<aop:pointcut expression="execution(* egovframework.geon..web.*Controller.*(..))" id="allControlPointCut"/>
<aop:aspect ref="printAdvice">
<aop:around method="printMethodName" pointcut-ref="allControlPointCut"/>
</aop:aspect>
</aop:config>
Advice 클래스를 빈으로 등록 합니다. bean으로 등록해야 해당 클래스가 메모리에 올라가 참조가 가능하게 됩니다.
pointcut 으로 공통적으로 메소드가 수행될 범위를 필터링 하고
그 범위 내의 메소드가 실행될 때 printMethodName 을 수행하도록 합니다.
<aop:around> 에 대한 설명은 위의 Link를 참고합니다.
around를 사용하므로 전후 처리 모두 가능하게 되며
pjp.proceed(); 을 기준으로 위의 소스가 전처리(stopWatch.start())가 되며 아래 소스가 후처리(stopWatch.stop())가 됩니다.
그래야 메소드의 수행시간을 알 수 있으므로 around로 설정한 것입니다.
이렇게 설정을 한 후 빌드 후에 *.do 요청을 하면 해당 메소드의 명과 수행에 걸린 시간이 콘솔에 출력되게 됩니다.