


핵심기능 : 시스템의 주요 목적, 메서드의 주요 기능
부가기능 : 주요 목적이 아닌 부가기능
횡단 관심사 : 부가 기능이 여러곳에서 반복적으로 적용되는 상황

어드바이스 : 실제로 실행되는 횡단관심사(부가기능) 코드를 의미한다.(시간측정로직)
/**
* 어드바이스: 가장 강력한 어드바이저, 전체 흐름을 제어할 수 있습니다.
* @param joinPoint
* @return
* @throws Throwable
*/
@Around("serviceLayer()") // 어노테이션 기반으로 포인트컷 설정
public Object aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable {
log.info("::: BEFORE :::");
try {
Object result = joinPoint.proceed();
System.out.println(result);
log.info("::: AFTER RETURNING :::");
return result;
} catch (Exception e) {
log.info("::: AFTER THROWING :::");
throw e;
} finally {
log.info("::: AFTER :::");
}
}
포인트컷 : 어드바이스를 적용할 구체적인 범위를 선택하는 규칙
/**
* 포인트컷 : 서비스(Service) 패키지 기반
*/
@Pointcut("execution(* com.standard.sparta.service..*(..))")
private void serviceLayer(){}
----------------------------------------------------------------------
/**
* 포인트컷 : 어노테이션 범위 기반
*/
@Pointcut("@annotation(com.standard.sparta.annotation.TrackTime)")
private void trackTimeAnnotaion(){}

// 반환타입 int, createCourse 이라는 매서드, 매개변수는 int 형 2개
execution(int createCourse(int, int))
// 반환타입 상관없음, createCourse 이라는 매서드, 매개변수는 int 형 2개
execution(* createCourse(int, int))
execution(* createCourse(..)) // 반환타입 상관없음, createCourse 이라는 매서드, 매개변수 상관없음
execution(* *(..)) // 반환타입 상관없음, 메서드이름 상관없음, 매개변수 상관없음
조인포인트 : 어드바이스가 적용되는 실행지점


@Slf4j
@Aspect
/**
* 애스팩트: 어드바이스와 포인트컷을 하나로 묶은 모듈
*/
public class AspectPractice {
// 포인트컷
// 어드바이스 위치
}
어드바이스 는 반복되는 횡단관심사를 정의해 놓은곳 입니다.
그 횡단관심사를 어느 범위에 적용할지 선택하는 것이 포인트컷 입니다.
그리고 그 범위 안에서 선택받은 객체들 혹은 객체가 타겟 이 되는 것입니다.
그 타겟 내에서 어드바이스 실제로 실행되는 시점을 조인포인트 라고 합니다.
