
Aspect 생성
package org.xyz; import org.aspectj.lang.annotation.Aspect; @Aspect @Component // Component를 붙인 것은 해당 Aspect를 스프링의 Bean으로 등록해서 사용하기 위함 public class UsefulAspect { }
- @Component로 빈을 등록을 해주고 + @Aspect 어노테이션을 붙이면 Pointcut과 Advice를 들고 있는 하나의 Aspect가 만들어 진다.
PointCut 선언
package org.xyz; import org.aspectj.lang.annotation.Aspect; @Aspect @Component // Component를 붙인 것은 해당 Aspect를 스프링의 Bean으로 등록해서 사용하기 위함 public class UsefulAspect { @Pointcut("execution(* transfer(..))") private void anyOldTransfer() {} }
- 해당 Aspect가 적용될 JoinPoint를 찾기 위한 패턴 또는 조건 생성
- 포인트 컷에 표현식이라고 부르기도 함
PointCut 결합
package org.xyz; import org.aspectj.lang.annotation.Aspect; @Aspect @Component // Component를 붙인 것은 해당 Aspect를 스프링의 Bean으로 등록해서 사용하기 위함 public class UsefulAspect { @Pointcut("execution(public * *(..))") private void anyPublicOperation() {} //public 메서드 대상 포인트 컷 @Pointcut("within(com.xyz.myapp.trading..*)") private void inTrading() {} // 특정 패키지 대상 포인트 컷 @Pointcut("anyPublicOperation() && inTrading()") private void tradingOperation() {} // 위의 두 조건을 and(&&) 조건으로 결합한 포인트 컷 }
- 특정 포인트컷 두개를 && 조건식을 통해 하나의 포인트 컷으로 결합도 가능하다.
Before Advice
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect public class BeforeExample { @Before("com.xyz.myapp.CommonPointcuts.dataAccessOperation()") public void doAccessCheck() { // ... } }
- 해당 Advice를 실행할 때 메소드를 이용하여 한번더 체크해보는 과정을 만든 것이다.
- 예제는 dataAccessOperation이라는 메서드가 Advice를 실행하기 전에 doAccessCheck라는 메서드를 실행해서 인증하라는 예제이다.
After Returning Advice
- 데이터를 return을 시킨 다음에 동작하는 advice이다
- 주로 로깅에서 사용한다.
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.AfterReturning; @Aspect public class AfterReturningExample { @AfterReturning("com.xyz.myapp.CommonPointcuts.dataAccessOperation()") public void doAccessCheck() { // ... } }
- dataAccessOperation이 마찬가지로 doAccessCheck라는 메소드를 실행시켜준다.
Around Advice
- 어떤 비즈니스 로직을 만들었을때 전이나 후에 동작하는 Advice이다.
- 주요기능을 사용할때 전과 후에 확인 가능하여 좋은 장점이 있다.
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.ProceedingJoinPoint; @Aspect public class AroundExample { @Around("com.xyz.myapp.CommonPointcuts.businessService()") public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable { // start stopwatch Object retVal = pjp.proceed(); // stop stopwatch return retVal; } }
- businessService라는 포인트컷의 전과 후에 필요한 동작을 추가한다.
- ProceedingJoinPoint라는 것은 지정된 포인트 컷에 위치를 의미한다.
- 포인트 컷을 잡아둔 함수를 실행 시키는 구조이다.