1. Execution 기반

2. 어노테이션 기반

3. Bean 기반

1. Execution 기반

→ 적용하고 싶지 않은 메서드에도 적용될 수 있음.

1-1) Execution 기반 Code

Untitled

→ Aspect, 흩어진 관심사(CrossCuttingConcern)를 묶어서 모듈화한 것.

→ Aspect에는 1) Advice(해야할 일)와 2) Point Cut(어떻게 할 것인가)이 들어감.

→ Join Point, 메서드 실행 시점임. Advice가 적용될 위치

1-2) @Around("execution(* me.gracenam.*.*EventService.**(..))")

Untitled

1-3) EventService를 *로 변경하면 여러 클래스에 적용할 수 있음.

→ @Around("execution(* me.gracenam..*.(..))")

Untitled

1-4) class SimpleEventService

Untitled

1-5) Console

Untitled

2. 어노테이션 기반

2-1) 어노테이션 직접 만들기

→ RetentionPolicy는 어노테이션 정보를 얼마나 유지해줄 것인가의 문제임.

Untitled

→ RetentionPolicyType은 CLASS(Defualt, 명시적으로 등록해주는 게 좋음)

→ Type을 SOURCE로 변경 시 컴파일 후 사라짐.

2-2) SimpleEventService

→ 직접 만든 어노테이션을 해당 메소드에 @PerfLogging 추가해주기

Untitled

2-3) PerfAspect

Untitled

3. Bean 기반

3-1) Bean 기반

Untitled

3-1)-1. Console

Untitled

3-2) 어떤 메소드가 실행되기 이전에 뭔가 하고 싶을 때

@Before

Untitled

3-2)-1. Console

Untitled

3-3) 그외

@Around를 통해 타겟 메서드의 Aspect 실행 시점을 지정했지만 다른 어노테이션들도 있음.

Untitled