JisooOh94/AopLocalCaching

[feat] AspectJ aop 적용

JisooOh94 opened this issue · 3 comments

요구사항

  • 서비스 소스 분석결과, private method 에도 LocalCaching 적용이 가능해야하는 요구사향 확인
  • 기존의 Spring AOP 로는 private method 에 대한 위빙이 불가능하여, AspectJ 를 이용한 AOP 로 대체
  • AspectJ 컴파일러로 기존 서비스 소스 빌드했을떄 발생할 수 있는 사이드 이펙트 조사 필요

Features

  • AspectJ AOP 를 위한 의존성 추가
  • AspectJ 컴파일러 설정 및 그에따른 사이드이펙트 버그 수정

See also

AspectJ 를 통한 컴파일타임 위빙을 하기 위해선

  1. IntelliJ 의 Java Complier 로 AspectJ Compiler 설정
    • Delegate to JavaC : AspectJ 관련 소스가 있는 클래스만 AspectJ 컴파일러가 빌드, 그 외엔 JavaC 가 빌드 하도록 설정 옵션
    • Path to Ajc compiiler : pom.xml 에 aspectjtools 의존성 추가시 자동으로 설정됨

image

  1. pom.xml 에 build plugin 으로 org.codehaus.mojo의 aspectj-maven-plugin 설정
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <version>1.11</version>
    <configuration>
        <showWeaveInfo>true</showWeaveInfo>
        <source>1.8</source>
        <target>1.8</target>
        <verbose>true</verbose>
        <complianceLevel>1.8</complianceLevel>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal>
                <goal>test-compile</goal>
            </goals>
        </execution>
    </executions>
</plugin>

AspectJ Aop 사용시 메서드 호출에 대한 2가지 JoinPoint 존재.

  • method call(method invocation) : 메서드 호출에 대한 JoinPoint. 메서드 실행되기 전의 JoinPoint 이므로 @around 와 사용 불가능
  • method execution : 메서드 실행에 대한 JoinPoint. @around 와 사용 가능

어노테이션을 통한 포인트컷 사용시, method call, method execution 2가지 JoinPoint 에모두 위빙되어 크로스커팅 로직이 2번 중복되어 수행됨
포인트컷 설정에 method execution 명시하여 중복 수행 방지

@Pointcut("@annotation(target) && execution(* *(..))")

포인트 컷 및 조인포인트 메서드만 정의해두었던 ThreadLocalCacheInterceptor 클래스와 ThreadLocalCacheInterceptor 에 주입되어 크로스커팅로직을 수행하던 LocalCacheSupport 클래스를 하나로 통합.

AspectJ Aop 의 컴파일 타임 위빙 사용시, 어드바이스 메서드에 DI 객체의 api 사용 불가능. 컴파일 타임 위빙의 경우 컴파일 시점에 어드바이스 코드를 대상 메서드에 추가하여 컴파일하나, DI의 경우, 웹어플리케이션 구동시 빈 컨테이너가 빈을 생성하여 주입하기 때문에 컴파일 타임엔 주입되지 않음.