인생을 코딩하다.

[Spring] Spring AOP를 이용한 메서드 시간측정 / @LogExecutionTime 본문

Spring

[Spring] Spring AOP를 이용한 메서드 시간측정 / @LogExecutionTime

Hyung1 2020. 10. 29. 01:17
728x90
반응형

흔히 알려진 스프링의 장점들 중 하나인 AOP란 것이 있다.'관점 지향 프로그래밍' 이라고 한다.

 

AOP에 관해 공부하던 중, 갑자기 내가 만든 메소드들에 성능을 측정해보고 비교해 보고 싶었다.그래서 AOP를 이용하여 메소드들의 성능을 측정해 볼 수 있다는 것을 알게되어서 구글링을 통한 학습을 하였고 AOP를 적용해서 2개의 메소드에 시간을 시간을 측정해보았다.

 

LogExecutionTime.java와 LogAspect.java는 Controller.java와 같은 패키지에 생성했다.

 

bulid.gradle에 dependancy를 추가해줘야 한다

implementation 'org.springframework.boot:spring-boot-starter-aop'

@Target로 어노테이션을 메서드에 사용하기 위해서 설정해준다. @Retention으로 어노테이션이 런타임까지 유지되도록 설정해준다.

@Around 를 사용하여 joinPoint를 매개변수로 받았다. Controller.java에서 여러개의 메서들 중 2개의 메서드만 성능을 측정해 볼 것이라서 @LogExecutionTime이 붙어있는 메서드에만 성능을 측정할 수 있도록 @Around를 사용하였다.

 

@Around를 붙이면 파라미터에 어노테이션을 붙일 수 있다. 즉 ProceedingJoinPoint 파라미터를 받을 수 있다.

 

그래서 value를 @annotation(LogExecutionTime)로 지정하였다.  joinPoint가 @LogExecutionTime를 붙인 메서드로 타겟시켰다.

 

jointPoint란 어노테이션입 붙어있는 메서드를 의미한다. 이 메서드를 살행 전 후로 시간을 측정하겠다는 의미가 된다.

 

그리고 object proceed = joinPoint.proceed(); 이 로직에서 타겟 메소드를 실행한다. 이 로직 위에서 메서드의 성능 측정을 시작하고 밑에서 성능 측정을 종료하고 logger를 이용하여 시간을 콘솔창에 출력하고, proceed를 리턴하여 콘솔에 결과를 출력했다.

 

controller.java

controller에서 성능을 측정할 메서드 상단에 @logExcutionTime를 붙여주었고, 성능 측정 결과가 콘솔창에 출력되었다.

 

이것이 바로 Spring이 제공해주는 어노테이션 기반의 AOP이고 Aspect이다. 프록시 패턴 기반으로 동작한다.

728x90
반응형
Comments