Capture Method Execution time in Spring Boot
Medium
메서드 실행 시간을 측정하는 다음과 같은 코드가 있다고 가정해 봅시다.
long startTime = (System.currentTimeMillis());
//YOUR LOGICAL CODE
long executionTime = (System.currentTimeMillis() - startTime) / 1000;
LOGGER.info("Time taken for calculation is : {} seconds", executionTime);
이 반복되는 코드를 모든 메서드에 추가하는 것은 매우 비효율적인 방법입니다. 그럼, 메서드 위에 어노테이션을 다는 것만으로도 이 코드를 모두 포함할 수 있다고 말씀드리면 어떨까요?
먼저, Spring AOP가 가능하게 다음과 같은 라이브러리를 추가해 주세요.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
이제 ExecutionTimeLogger라는 이름으로 스프링 부트에서 커스텀 어노테이션을 작성해 보겠습니다. 보시다시피 어노테이션은 런타임에 작동하며 메서드 수준에서 적용할 수 있습니다.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExecutionTimeLogger {
}
이제 Aspect로 동작하는 클래스를 만들어 보겠습니다. 이 클래스는 메서드 실행 시간을 계산할 수 있는 로직을 갖고 있습니다. Aspect를 사용하는 방법에는 여러가지가 있고, @Before, @After, @Around, @Pointcut 등의 어노테이션을 상황에 따라 사용할 수 있습니다.
아래 코드와 같이 클래스 ExecutionTimeLoggerAspect를 생성하고 @Aspect로 어노테이션을 달았습니다.
@Aspect
@Component
public class ExecutionTimeLoggerAspect {
@Around("@annotation(ExecutionTimeLogger)")
public Object executionTimeLogger(ProceedingJoinPoint joinPoint) {
// 실행 시간 계산하는 로직
}
}
필요한 구성은 모두 완료 되었습니다. 이제 우리가 할 일은 메서드 실행 시간을 캡처하고 싶은 곳이면 어디든지 이 어노테이션을 사용하는 것입니다. 메서드의 실행 시간을 측정하고 싶다면, 아래 코드와 같이 메서드 위에 어노테이션을 추가해 주세요!
public class CustomLoggingService {
@ExecutionTimeLogger
public void myMethod() {
//YOUR LOGICAL CODE
}
}
쉽지 않나요? 얼마나 많은 시간과 노력이 절약되는지 상상해 봅시다. 요약하자면, 우리가 한 일은 다음과 같습니다.
커스텀 어노테이션 작성
@Aspect 클래스 생성 후 실행 시간을 계산하는 메서드 포함하기
이 메서드를 @Around로 선언
실행 시간을 기록할 메서드에 이 어노테이션 달기
다음 내용이 궁금하다면?
이미 회원이신가요?
2023년 12월 4일 오후 1:26
G
... 더 보기여러분 PostgreSQL 프로시저는 Python, JavaScript은 물론 Perl, Java, Lua 등도 사용할 수 있답니다~* 대부분 구식🤭 MySQL만 쓰셔서 모르시겠지만.. (도망간다)