본문 바로가기
공부/Spring

[스프링 입문](5) AOP

by 다음에바꿔야지 2024. 1. 6.

메소드의 호출 시간을 측정하고 싶다.

어떻게 해야할까?

 

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");
             }
         }
     }

이렇게 하면 공통과 핵심을 분리할 수 있고, 원하는 적용 대상을 선택할 수 있다.