[spring] AOP (스프링 입문 by 김영한)

su_y2on·2022년 1월 14일
0

Spring

목록 보기
12/30
post-thumbnail

AOP

예를들어 몇몇 메서드에 실행시간을 체크해보고싶은 상황이라고 한다면 해당 메서드들의 시작과 끝에 시간을 측정하고 출력하는 코드를 붙여야할 것입니다. 다행히 그게 몇개 밖에 되지않는다면 괜찮겠지만 만약 몇십개, 몇백개라면 어떨까요?

이때 필요한 기술이 바로 AOP입니다. AOP는 공통적인사항(시간측정)을 핵심관심사항과 분리해줍니다. 마치 아래와 같이요!



AOP적용전

AOP적용후




이를 구현하기 위해 먼저 aop패키지를 따로 만들어줍니다. 그리고 그 안에 TimeTraceApp이라는 java class를 생성해줍니다

@Component
@Aspect
public class TimeTraceApp {

    @Around("execution(* hello.hellospring..*(..))") // 적용범위
    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable{
        long start = System.currentTimeMillis();
        System.out.println("START: " + joinPoint.toString());
        try{
            Object result = joinPoint.proceed();
            return result;
        }finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println("END: " + joinPoint.toString() + " " + timeMs + "ms");
        }

    }
}

컴포넌트 스캔방식으로 스프링빈으로 등록해주고 @Aspect라는 어노테이션을 붙여줍니다. 그리고 실행할 함수를 짜줍니다. 지금은 시간을 측정해야하기때문에 start를 먼저 측정해준 뒤 try문에서 메서드를 실행해줍니다. 메서드가 끝난 후에 finish를 측정한뒤 경과시간을 출력해주는 코드입니다. 이 execute함수 위에 @Around 어노테이션을 붙여서 어디까지 이 시간측정을 적용할지 범위를 정해줄 수 있습니다. 여기서는 모든 메서드에 적용하도록 상위 패키지 아래 모든 것으로 적어준 것입니다.



동작원리

실제 스프링빈들 앞에 proxy빈(가짜)을 만들어주고 스프링컨테이너는 의존성 주입때 proxy빈을 넣어줍니다. 그러면 실제 빈을 실행할 때도 proxy빈이 수행되고 joinpoint가 각각의 메서드들이 실행될 때 개입해 시간체크를 해주는 방식입니다. 여기서 joinpoint의 proceed()가 실행될 때 실제 프록시빈이 수행됩니다.

0개의 댓글