Spring boot

[입문] AOP

모든 메소드의 호출 시간을 측정하고싶다면?

모든 메소드에 시간 관련 코드를 집어넣어야 한다.

이와 같이 공통으로 적용하는 사항을 '공통 관심 사항'이라고 하고

비즈니스 로직을 '핵심 관심 사항'이라고 한다.

 

AOP (Aspect Oriented Programming, 관점 지향 프로그래밍)

을 활용하여 공통 관심 사항과 핵심 관심 사항 로직을 분리하고 편리하게 적용한다.

 

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

aop 패키지를 만들고 클래스를 생성한다.

aop로 사용하기 위해 @Aspect를, 스프링 빈에 등록하기 위해 @Component를 붙인다.

메소드에 @Around를 붙여 공통 관심 사항 로직이 적용될 곳을 특정한다.