AOP 적용해보기

이호인·2022년 5월 31일
0

Spring

목록 보기
4/6

저번 포스팅에서 AOP에 대한 정리를 했었다. 직접 사용해보면 더 기억에 잘 남고 이해도 잘 될 것 같아서 현재 진행하고 있는 프로젝트에 적용해보려고 했다.

현재 로그인 여부를 체크하는 필터를 사용하고 있다. 필터와 인터셉터의 차이를 정리하면서 언급했듯이 보통 스프링에서 관리하는 인터셉터는 스프링 빈들을 다룰 수 있어 로그인 여부를 확인할 때는 인터셉터를 많이 사용하지만, 요즘엔 기술이 발달하여 필터도 스프링 빈들을 다룰 수 있게 되었고 그에 따라 이번 프로젝트에서는 리턴이 더 빠른 필터를 사용하게 되었다.

원래 AOP를 공부할 때 쯤에는 이 필터를 AOP로 변경해봐야겠다는 생각을 했지만 현재 상황에서 굳이 바꿀 이유도 없는 것 같고, 평소에 메서드 측정 시간, 성능 같은 것에도 관심이 있었어서 로깅이나 이런 측정에 많이 쓰는 AOP를 통해 한번 적용해보기로 했다.

처음 해보는 것이라 dhk22.log 님의 간단한 AOP 적용 예제를 보고 따라서 적용해보고, 모르는 메서드나 용어들을 따로 찾아보는 식으로 진행했다. (감사합니다 🙇‍♂️)

들어가기 전에 다시 한번 정리

📌 AOP 주요 개념

Aspect : 흩어진 관심사를 모듈화 한 것. 주로 부가 기능을 모듈화
Target : Aspect를 적용하는 곳 (클래스, 메소드 등)
Advice : 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가 기능을 담은 구현체
JointPoint : Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에 서 값을 꺼내올 때 등 다양한 시점에 적용 가능
PointCut : 어디에 적용해야 하는지에 대한 정보

그냥 저번 시간에 정리할 때는 확실히 들어오지는 않았으나 적용해보면서 한층 더 이해가 되었다.

1. AOP의 JoinPoint로 사용할 마킹용 어노테이션을 작성하자.

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodTimer {
}

@Target은 부가기능을 부여할 대상을 얘기한다. 여기서는 어노테이션이 붙은 메서드에 대해 수행되도록 설정했다.
@Retention은 이 어노테이션의 정보를 어디까지 유지할 것인가, 여기서 RUNTIME은 컴파일 이후에도 JVM에 의해서 참조 가능하도록 설정한다.

2. AOP 클래스를 작성한다.

@Slf4j
@Aspect
@Component
public class ExecutionTimer {

    @Pointcut("@annotation(com.hoin.boardStudy.board.config.aop.MethodTimer)")
    private void timer(){};

    @Around("timer()")
    public void AssumeExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {

        StopWatch stopWatch = new StopWatch();

        stopWatch.start();
        joinPoint.proceed();
        stopWatch.stop();

        long totalTimeMillis = stopWatch.getTotalTimeMillis();

        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        String methodName = signature.getMethod().getName();

        log.info("실행 메서드 : {}, 실행시간 = {}ms", methodName, totalTimeMillis);
    }
}

@Aspect 어노테이션을 적용하면서 PointCut과 Advice 설정, 그리고 Aspect 구현을 함께 제공한다.
@Pointcut을 통해 JoinPoint를 어노테이션으로 설정해준다.
메서드 실행 전, 후로 시간을 공유하기 때문에 @Around 를 사용해준다.

3. 실행 시간을 측정할 메서드에 적용해준다.

이런 식으로 작성한 어노테이션이 붙어있는 메서드를 실행하게 되면

이렇게 실행 메서드의 이름과, 실행시간을 콘솔에 찍어주게 된다.

reference!

간단한 AOP 적용 예제
Spring AOP - 어노테이션 만들기
AOP구현(@Aspect 어노테이션 사용)

profile
공부 기록

0개의 댓글