공부/Spring
[스프링 입문](5) AOP
다음에바꿔야지
2024. 1. 6. 16:53
메소드의 호출 시간을 측정하고 싶다.
어떻게 해야할까?
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");
}
}
}
이렇게 하면 공통과 핵심을 분리할 수 있고, 원하는 적용 대상을 선택할 수 있다.