일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 토비의 스프링
- JPA
- Java
- IntellJ
- Kotlin
- mysql
- 백준
- spring
- jvm
- SpringBoot
- 자바
- 토비의 스프링 정리
- MSA
- 스트림
- 이스티오
- GC
- Collection
- 자바 ORM 표준 JPA 프로그래밍
- Stream
- 스프링
- list
- redis
- 보조스트림
- OS
- gradle
- 쿠버네티스
- K8s
- Stack
- Real MySQL
- thread
- Today
- Total
인생을 코딩하다.
[Spring] Spring AOP를 이용한 메서드 시간측정 / @LogExecutionTime 본문
흔히 알려진 스프링의 장점들 중 하나인 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에서 성능을 측정할 메서드 상단에 @logExcutionTime를 붙여주었고, 성능 측정 결과가 콘솔창에 출력되었다.
이것이 바로 Spring이 제공해주는 어노테이션 기반의 AOP이고 Aspect이다. 프록시 패턴 기반으로 동작한다.
'Spring' 카테고리의 다른 글
[Spring] Spring이 왜 Spring인지? 와 SpringBoot VS Spring (0) | 2020.11.08 |
---|---|
[Spring] @ControllerAdvice -> @RestControllerAdvice (0) | 2020.10.31 |
[Spring] ExceptionHandler (0) | 2020.10.25 |
[Spring] checked exception을 unchecked exception으로 변경해서 던져야 하는 경우 (0) | 2020.10.22 |
[Spring] ArgumentMatcher<T> (단위테스트 할 때) (0) | 2020.10.21 |