ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring boot #8 AOP
    Study/Spring boot 2021. 7. 14. 17:22

     

     

    지금까지 간단한 웹 서비스를 위한 메소드들을 구현해봤다. 근데 만약에 각 기능들의 수행시간을 측정하고 싶다면 어떻게 해야할까? 단순하게 생각하면 모든 메소드들의 시작부분과 끝부분에 시간측정 로직을 추가해주면 된다. 그런데 만약 측정하고자 하는 메소드들이 100개가 넘어가면 위 같은 과정을 너무 고된작업이 될 것이다.

     

    스프링에서 AOP란 공통 관심 사항과 핵심 관심 사항을 분리하여 구현하는것을 의미한다. 그래서 각 핵심 기능들은 공통 기능을 가져와 사용할 수 있다. 간단하게 AOP를 이용하여 시간측정 기능을 구현해보자.

    먼저 패키지내에 클래스를 생성해주자. 그리고 Aspect으로 사용하기 위해 아래처럼 @Component, Aspect 어노테이션을 등록해주자.

    @Component
    @Aspect
    public class TimeTrace {
    
    
    }

     

     

    그 다음 시간 측정을 할 execute 메소드를 구현해보자. ProceedingJointPoint 객체를 주입받아서 사용해야 한다. 이 객체는 bean이 알아서 주입해준다. proceedingJointPoint.proceed()을 메소드를 실행하는것을 의미한다. 즉 아래 코드는 start 시간을 구한 후, proceed 메소드를 통해 기능을 실행 후 finally에서 수행시간을 출력하는것이다.

    @Around 어노테이션도 추가해야한다. "execution(* hello.hellospring..*(..))"의 의미는 hello.hellospring 패키지밑에 있는 파라미터가 0이상인 모든 메소드가 실행될때 실행하라는 의미와 같다.

    @Around("execution(* hello.hellospring..*(..))")
    public Object execute(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
    
        long start = System.currentTimeMillis();
    
        System.out.println("start app : " + proceedingJoinPoint.toString());
    
        try{
            return proceedingJoinPoint.proceed();
        } finally {
            long end = System.currentTimeMillis();
            long totalMs = end - start;
    
            System.out.println("end app : " + proceedingJoinPoint.toString() + " " + totalMs+"Ms");
        }
    }

     

     

    이제 직접 서버를 실행시켜서 기능을 실행해보면, 아래처럼 콘솔창에 수행 시간이 출력되는것을 확인할 수 있다.

     
     
     

    댓글

Designed by Tistory.