Aspect: Advice + PointCut
= 어떤 부가기능을 어느 핵심기능에 어떻게 적용했는가?
Advice(부가기능): 어떤 부가기능을 언제?
PointCut: 부가기능 적용 위치. 어느 패키지/메서드에?
@Around : 핵심기능의 수행 전후에 모두 수행되는 어드바이스
joinpoint : 부가기능을 적용할 수 있는 포인트컷 위치의 후보를 가리킴
// 핵심기능 수행
Object output = joinPoint.proceed();
return output;
원래 수행하려고 했던 핵심기능 수행
@Aspect
어드바이스 종류
@Around : '핵심기능' 수행 전과 후 (@Before + @After)
@Before : '핵심기능' 호출 전 (ex. Client 의 입력값 Validation 수행)
@After : '핵심기능' 수행 성공/실패 여부와 상관없이 언제나 동작 (try, catch 의 finally() 처럼 동작)
@AfterReturning : '핵심기능' 호출 성공 시 (함수의 Return 값 사용 가능)
@AfterThrowing : '핵심기능' 호출 실패 시. 즉, 예외 (Exception) 가 발생한 경우만 동작 (ex. 예외가 발생했을 때 개발자에게 email 이나 SMS 보냄)
포인트컷
execution(modifiers-pattern? return-type-pattern declaring-type-pattern? method-name-pattern(param-pattern) throws-pattern?)
@Around("execution(public * com.sparta.springcore.controller..*(..))")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable { ... }
modifiers-pattern, 제어자
return-type-pattern, 반환타입
declaring-type-pattern, 클래스
클래스명 (패키지명 필요)
com.sparta.springcore.controller.*
-> controller 패키지의 모든 클래스에 적용
com.sparta.springcore.controller..
-> controller 패키지 및 하위 패키지의 모든 클래스
method-name-pattern(param-pattern)
@Pointcut
포인트컷 재사용 가능
포인트컷 결합 (combine) 가능