Java/spring
Spring 입문 - AOP
티코딩
2024. 1. 25. 15:49
ㅁ 모든 메서드의 호출 시간을 측정하고 싶다면?
public Long join(Member member){
long start = System.currentTimeMillis();
try{
validateDuplicateMember(member); // 중복회원검증 //메서드 뽑는 단축기 커맨드 + t, extract Method
memberRepository.save(member);
return member.getId();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish-start;
System.out.println("join = " + timeMs + "Ms");
}
//같은 이름이 있는 중복 회원X
}
이런식으로 모든 메서드에 try문을 넣어서 재봐야한다. 시간을 측정하는 기능은 핵심 관심 사항이 아니다.
핵심 기능은 try 안에 있는 로직이다. 시간을 측정하는 기능은 공통 관심 사항이다.
시간을 측정하는기능과 핵심 비지니스 로직이 섞여 유지보수가 어려워진다. 시간을 측정하는 로직을 공통 로직으로 만들기 어렵다.
이럴때 AOP를 사용해 공통관심사항을 만들고 원하는곳에만 적용을 시키는것이다.
ㅁ 시간 측정 AOP 등록
@Aspect
@Component
public class TimeTraceAop {
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");
}
}
}
시간측정기능을 만들어주고, 스프링빈으로 등록해준다.(@Component로)
타겟팅은 어떻게 할까?
@Around("execution(* hello.user..*(..))") 해주면 hello 아래 user 아래 디렉토리에 모든 메서드들로 타게팅 된다.
한번 테스트를 해보면 아래와 같이 모든 시간이 측정이 된다.
이렇게 AOP를 통해서 회원가입, 회원 조회등 핵심 관심사항과 시간을 측정하는 공통 관심 사항을 분리한다. 시간을 측정하는 로직을 별도의 공통 로직으로 만들었다. 핵심 관심 사항을 깔끔하게 유지할 수 있다. 변경이 필요하면 이 로직만 변경하면 된다. 원하는 적용 대상을 선택할 수 있다.