1. Execution 기반
→ 적용하고 싶지 않은 메서드에도 적용될 수 있음.
1-1) Execution 기반 Code
→ Aspect, 흩어진 관심사(CrossCuttingConcern)를 묶어서 모듈화한 것.
→ Aspect에는 1) Advice(해야할 일)와 2) Point Cut(어떻게 할 것인가)이 들어감.
→ Join Point, 메서드 실행 시점임. Advice가 적용될 위치
1-2) @Around("execution(* me.gracenam.*.*EventService.**(..))")
1-3) EventService를 *로 변경하면 여러 클래스에 적용할 수 있음.
→ @Around("execution(* me.gracenam..*.(..))")
1-4) class SimpleEventService
1-5) Console
2. 어노테이션 기반
2-1) 어노테이션 직접 만들기
→ RetentionPolicy는 어노테이션 정보를 얼마나 유지해줄 것인가의 문제임.
→ RetentionPolicyType은 CLASS(Defualt, 명시적으로 등록해주는 게 좋음)
→ Type을 SOURCE로 변경 시 컴파일 후 사라짐.
2-2) SimpleEventService
→ 직접 만든 어노테이션을 해당 메소드에 @PerfLogging 추가해주기
2-3) PerfAspect
3. Bean 기반
3-1) Bean 기반
3-1)-1. Console
3-2) 어떤 메소드가 실행되기 이전에 뭔가 하고 싶을 때
@Before
3-2)-1. Console
3-3) 그외
@Around를 통해 타겟 메서드의 Aspect 실행 시점을 지정했지만 다른 어노테이션들도 있음.