Open snaag opened 1 year ago
/**
* 회원 가입
*/
// before
// 핵심 비즈니스 로직만 있었음
public Long join(Member member) {
validateDuplicateMember(member); // 중복 회원 검증
Member joinMember = memberRepository.save(member);
return joinMember.getId();
}
// after
// 함수의 실행 시간을 재는 로직이 추가되면서, 핵심 비즈니스 로직과 섞여 지저분해짐
public Long join(Member member) {
long start = System.currentTimeMillis();
try {
validateDuplicateMember(member);
Member joinMember = memberRepository.save(member);
return joinMember.getId();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("join = " + timeMs + "ms");
}
}
/**
* 전체 회원 조회
*/
// before
// 핵심 비즈니스 로직만 있었음
public List<Member> findMembers() {
return memberRepository.findAll();
}
// after
// 함수의 실행 시간을 재는 로직이 추가되면서, 핵심 비즈니스 로직과 섞여 지저분해짐
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");
}
}
@Around("execution(* hello.hellospring..*(..))")
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;
@Aspect
@Component
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"); // 함수 이름 얻어올 수 있음
}
}
}