Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 코딩공부
- 코딩
- CS
- aop
- 자료구조
- github
- 항해99
- 99클럽
- wil
- Entity
- 회고
- 프로그래머스
- 면접(java
- HTML
- Spring
- Til
- Java
- 이진 탐색(binary search)
- 코딩문제
- 메서드
- 배열
- Grafana
- 개발자 취업
- 자바
- ArrayList
- GIT
- 코딩테스트 준비
- cs 공부)준비
- 정렬 알고리즘(sort algorithm)
- css
Archives
- Today
- Total
hayu's 개발 일지
[TIL]240503 Custom Annotation과 AOP로 메서드 실행시간 측정하기 본문
Custom Annotation과 AOP로 메서드 실행시간 측정하기
실행 시간을 측정하고 싶은 메서드에 @TimeTrace 라는 에너테이션을 추가하면 동작되도록 하기
build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-aop'
}
커스텀 에너테이션을 만든다.
TimeTrace.java
package com.sparta.moit.global.config.aop;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Timer { /*타겟은 메서드, 에너테이션이 런타임이 유지되도록*/
}
aop를 이용하여 @TimeTrace 어노테이션이 붙은 메서드의 실행 시간을 로그에 출력하는 코드를 짠다.
TimeTraceAspect.java
package com.sparta.moit.global.config.aop;
import lombok.extern.log4j.Log4j2;
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.springframework.stereotype.Component;
import org.springframework.util.StopWatch;
@Log4j2
@Component
@Aspect
public class TimerAspect {
// @Pointcut("execution(* com.example.demo.repository..*(..))")
@Pointcut("@annotation(com.sparta.moit.global.config.aop.TimeTrace)")
private void timerePointcut() {
} /*@TimeTrace를 포인트컷으로 지정하는 메서드*/
@Around("timerPointcut()") /*aop의 포인트컷 지정 */
public Object traceTime(ProceedingJoinPoint joinPoint) throws Throwable {
StopWatch stopWatch = new StopWatch(); /*메서드 실행시간 측정을 위해 객체 생성*/
try {
stopWatch.start();
return joinPoint.proceed(); // 실제 타겟 호출
} finally {
stopWatch.stop();
log.info("{} - Total time = {}s", /*로그에 메서드 실행 시간을 기록*/
joinPoint.getSignature().toShortString(),
stopWatch.getTotalTimeSeconds());
}
}
}
⇒ timeTracePointcut()는 포인트컷을 정의하는 메서드이고 @Around는 메서드를 적용하는 것이다. 즉, 둘은 동반되어야한다.
⇒ joinPoint.proceed()는 메서드를 호출하고 ProceedingJoinPoint는 메서드의 정보를 가져온다.
→ return joinPoint.proceed() : 실제 대상 메서드 즉, 커스텀 에너테이션을 호출해서 실행하는것이다. 실제 메서드가 실행 범위 내에서 발생하는 권한은 유지된다. 시간 측정을 위해 호출한다.
사용해보기
/* 인기 모임 top 5 */
@Timer
@GetMapping("/popular")
public ResponseEntity<?> getPopularMeeting() {
List<GetPopularResponseDto> responseDtoList = meetingService.getPopularMeeting();
return ResponseEntity.ok().body(ResponseDto.success("인기 모임 top 5", responseDtoList));
}
결과
[2024-05-02 23:17:30.117] [INFO ] [http-nio-8080-exec-2] c.s.m.g.config.aop.TimerAspect MeetingController.getPopularMeeting() - Total time = 1.0474478s
참고 자료
'스터디 > spring' 카테고리의 다른 글
[TIL]240426 SSE(Server-Sent-Events) (0) | 2024.04.26 |
---|---|
[TIL]240419 Prometheus & Grafana (1) | 2024.04.19 |
[TIL]240405 extends, implements 차이 (0) | 2024.04.05 |
[TIL]240329 스프링 부트와 AWS로 혼자 구현하는 웹서비스: -5장 스프링 시큐리티 & 인증, 인가 (3) | 2024.03.29 |
[TIL]240322 스프링 부트와 AWS로 혼자 구현하는 웹서비스: -4장 머스테치 & CRUD (1) | 2024.03.22 |