IT/SpringBoot
Spring Boot AOP
WsCode
2022. 3. 22. 18:10
프로그램 개발중 만약 각 메소드마다 시작 시간, 종료시간, 걸린시간을 출력하기위해서는 어떻게 해야할까요?
모든 메소드 호출마다 try문으로 감싸서 하는방법도있겠지만.. 시간과 고통이 엄청나겠죠.
이럴때 AOP를 이용하여 공통처리를하게된다면 빠른방법으로 처리할수있습니다.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.3.16</version>
</dependency>
pom.xml에 dependency를 추가합니다.
/**
* AOP - 시작, 종료 공통 로직
*/
@Component
@Aspect
@Slf4j
public class TraceAop {
/**
* 모든 패키지에 적용되는 시작, 종료 공통 로직
* 시작시간 , 종료시간 출력
*/
@Around("execution(* com.twocow.song..*(..))")
public Object executeTimeTrace(ProceedingJoinPoint joinPoint) throws Throwable {
// 시작 전 사용될 내용
long start = System.currentTimeMillis();
log.info("START : " + joinPoint.toString());
try {
// 본문 내용 시작
Object result = joinPoint.proceed();
return result;
} finally {
// 종료 후 사용될 내용
long finish = System.currentTimeMillis();
long timeMs = finish - start;
log.info("END : " + joinPoint.toString() + " " + timeMs + "ms" );
}
}
}
TraceAop 클래스를 추가하였습니다.
@Around 어노테이션에는 패키지 범위를 지정할 수 있습니다.
패키지 범위를 적게 설정한다면 해당 패키지가 실행 될때만 수행됩니다.
join.proceed(); 에서 본문내용이 실행된 후 finally에서 완료 시간을 찍게됨으로 저희가 원하는 시간을 모든 메소드 실행마다 찍을수 있습니다.
원하는 패키지단위를 조절하거나 조금씩 입맛에 맞게 수정하여 사용하면 될것같습니다.