[feat] AspectJ aop 적용
JisooOh94 opened this issue · 3 comments
JisooOh94 commented
요구사항
- 서비스 소스 분석결과, private method 에도 LocalCaching 적용이 가능해야하는 요구사향 확인
- 기존의 Spring AOP 로는 private method 에 대한 위빙이 불가능하여, AspectJ 를 이용한 AOP 로 대체
- AspectJ 컴파일러로 기존 서비스 소스 빌드했을떄 발생할 수 있는 사이드 이펙트 조사 필요
Features
- AspectJ AOP 를 위한 의존성 추가
- AspectJ 컴파일러 설정 및 그에따른 사이드이펙트 버그 수정
See also
JisooOh94 commented
AspectJ 를 통한 컴파일타임 위빙을 하기 위해선
- IntelliJ 의 Java Complier 로 AspectJ Compiler 설정
- Delegate to JavaC : AspectJ 관련 소스가 있는 클래스만 AspectJ 컴파일러가 빌드, 그 외엔 JavaC 가 빌드 하도록 설정 옵션
- Path to Ajc compiiler : pom.xml 에 aspectjtools 의존성 추가시 자동으로 설정됨
- 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>
JisooOh94 commented
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(* *(..))")
JisooOh94 commented
포인트 컷 및 조인포인트 메서드만 정의해두었던 ThreadLocalCacheInterceptor 클래스와 ThreadLocalCacheInterceptor 에 주입되어 크로스커팅로직을 수행하던 LocalCacheSupport 클래스를 하나로 통합.
AspectJ Aop 의 컴파일 타임 위빙 사용시, 어드바이스 메서드에 DI 객체의 api 사용 불가능. 컴파일 타임 위빙의 경우 컴파일 시점에 어드바이스 코드를 대상 메서드에 추가하여 컴파일하나, DI의 경우, 웹어플리케이션 구동시 빈 컨테이너가 빈을 생성하여 주입하기 때문에 컴파일 타임엔 주입되지 않음.