Programing/Spring

AOP 설정을 활용한 모든 메소드 수행시간 출력

리커니 2017. 1. 26.
반응형

 

 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 요청을 하면 해당 메소드의 명과 수행에 걸린 시간이 콘솔에 출력되게 됩니다.

 

 

반응형

댓글

💲 추천 글