메소드의 호출 시간을 측정하고 싶다.
어떻게 해야할까?
MemberService에 회원 조회 시간을 측정하는 코드를 추가한다.
package hello.hellospring.service;
@Transactional
public class MemberService {
/**
* 회원가입
*/
public Long join(Member member) {
long start = System.currentTimeMillis();
try {
validateDuplicateMember(member); //중복 회원 검증
memberRepository.save(member);
return member.getId();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("join " + timeMs + "ms");
}
}
/**
* 전체 회원 조회
*/
public List<Member> findMembers() {
long start = System.currentTimeMillis();
try {
return memberRepository.findAll();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("findMembers " + timeMs + "ms");
}
}
}
이렇게 추가한다면, 핵심 로직(회원 가입, 회원 조회)과 공통 관심 사항(메서드 호출 시간)이 섞여 유지보수가 어렵다.
이럴 때, AOP(Aspect Oriented Programming)를 적용하여 공통 관심 사항과 핵심 관심 사항을 분리할 필요가 있다.
시간 측정 AOP 등록
package hello.hellospring.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class TimeTraceAop {
@Around("execution(* hello.hellospring..*(..))")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
System.out.println("START: " + joinPoint.toString());
try {
return joinPoint.proceed();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("END: " + joinPoint.toString()+ " " + timeMs + "ms");
}
}
}
이렇게 하면 공통과 핵심을 분리할 수 있고, 원하는 적용 대상을 선택할 수 있다.
'공부 > Spring' 카테고리의 다른 글
[스프링 핵심](2) 회원, 주문과 할인 예제2 + IoC, DI, 그리고 컨테이너 (0) | 2024.01.07 |
---|---|
[스프링 핵심](1) 회원, 주문과 할인 예제 (0) | 2024.01.06 |
[스프링 입문](4) 회원 관리 예제를 통한 웹 MVC 개발 2 (1) | 2024.01.06 |
[스프링 입문](3) 스프링 빈과 의존관계 (0) | 2024.01.06 |
[스프링 입문](2) 회원 관리 예제를 통한 MVC 학습 (1) | 2024.01.06 |