여러 클래스나 기능에 걸쳐서 있는 관심사, 그리고 그것들을 모듈화함
AOP 중에서 가장 많이 활용되는 부분은 @Transactional(트랜잭션 관리), @Casheable 기능
조언,AOP에서 실제로 적용하는 기능(로깅, 트랜잭션, 캐시, 인증 등)을 뜻함
모듈화된 특정 기능이 실행 될 수 있는 연결 포인트
Join Point 중에서 해당 Aspect를 적용할 대상을 뽑을 조건식
Advice가 적용될 대상 오브젝트
대상 오브젝트에 Aspect를 적용하는 경우 Advice를 덧붙이기위해 하는 작업을 AOP Proxy라고 함
주로 CGLIB(Code Generation Library, 실행 중에 실시간으로 코드를 생성하는 라이브러리) 프록시를 사용하여 프록시 처리
Advice를 비즈니스 로직 코드에 삽입하는 것을 말함
AspectJ는 AOP를 제대로 사용하기 위해 꼭 필요한 라이브러리
기본적으로 제공되는 Spring AOP로는 다양한 기법(PointCut등)의 AOP를 사용할 수 없음
@Aspect
@Component //Component를 붙인 것은 해당 Aspect를 스프링의 Bean으로 등록해서 사용하기 위함
public class UsefulAspect{
}
해당 Aspect의 Adivce(실행할 액션)이 적용될 Join point를 찾기 위한 패턴 또는 조건 생성
@Aspect
@Component //Component를 붙인 것은 해당 Aspect를 스프링의 Bean으로 등록해서 사용하기 위함
public class UsefulAspect{
@Pointcut("exection(* transfer(..))"")
private void anyOldTransfer() {
}
}
@Pointcut("exection(public * *(..))")
private void anyPubicOperation() {} // public 메서드 대상 포인트 컷
@Pointcut("within(com.xyz.myapp.trading..(..))")
private void inTrading() {} // 특정 패키지 대상 포인트 컷
@Pointcut("anyPublicOperation() && inTrading()")
private void tradingOperation() {} // 위의 두 조건을 and (&&) 조건으로 결합한 포인트 컷
포인트 컷들을 활용하여 포인트컷의 전 / 후 / 주변에서 실행될 액션을 정의함
dataAccessOperation() 이라는 미리 정의된 포인트 컷의 바로 전에 doAccessCheck가 실행
@Aspect
public class BeforeExample{
@Before("com.xyz.myapp.CommonPointcuts.dataAccessOperaion()")
public void doAccessCheck(){
// ...
}
}
dataAccessOperation() 라는 미리 정의된 포인트 컷에서 return이 발생된 후 실행
@Aspect
public class AfterReturningExample{
@AfterReturning("com.xyz.myapp.CommonPointcuts.dataAccessOperaion()")
public void doAccessCheck(){
// ...
}
}
businessService() 라는 포인트 컷의 전/후에 필요한 동작을 추가
@Aspect
public class AroundExample{
@Around("com.xyz.myapp.CommonPointcuts.dataAccessOperaion()")
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
// start stopwatch
Object retVal = pjp.proceed();
// stop stopwatch
return retVal
}
}