Spring Framrwork

Spring framework AOP와 Annotaion을 이용한 Stop Watch 로그

gregorio 2018. 9. 4. 10:40

Spring Framework에서 AOP와 Annotation을 이용하여 Elapsed time을 Log에 생성하는 예제이다.


먼저 StopWatch Annotation 생성한다.


■ StopWatch.java


import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;


@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target({ElementType.METHOD})

public @interface StopWatch {

}



StopWatch Annotation은 Method Level에 적용하기 때문에 @Target을 METHOD로 정의하였으며, Runtime시에 적용한다.



다음은 메소드의 수행시간을 로그에 기록하기 위해 AOP 생성한다.


■ LoggingAspect.java


import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Pointcut;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Component;

import org.springframework.util.StopWatch;


@Aspect

@Component

public class LoggingAspect {


@Around("@annotation(sehati.bi.annotation.StopWatch)")

public Object stopWatch(ProceedingJoinPoint joinPoint) throws Throwable {

StopWatch stopWatch = new StopWatch();

Object proceed = null;

String className = joinPoint.getSignature().getName();

try {

stopWatch.start();

proceed = joinPoint.proceed();

}

finally {

stopWatch.stop();

LOGGER.info("{} elapsed time :: {}", className, stopWatch.getTotalTimeMillis());

}

return proceed;

}


}




@Aspect Annotation을 이용하여 AOP 를 구현한다.

@Around Advice을 적용 시 Point Cut을 StopWatch Annotation을 사용한 모든 Method는 stopWatch 메소드에 의해 호출된다.



다음은 @StopWatch Annotation 적용 예제이다.


  @RequestMapping(value = "/bi/mainpage.do")

@StopWatch

public String mainPageView(HttpServletRequest request) throws Exception {

LOGGER.info("Called :: {}", request.getRequestURL());

return "main";

}


mainPageView를 @StopWatch Annotation을 적용해 로그에 Elasped time이 기록된다.