This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| back-end:spring [2022/06/19 10:32] – [Aspect & Advisor] ledyx | back-end:spring [2024/10/14 00:35] (current) – [Lifecycle Callbacks] ledyx | ||
|---|---|---|---|
| Line 65: | Line 65: | ||
| </ | </ | ||
| - | * 메서드를 구현하고 @PostConstruct, | + | * 메서드를 구현하고 @PostConstruct, |
| Line 99: | Line 99: | ||
| client-- request --> | client-- request --> | ||
| ProxyFactory-- Proxy 대상 객체가 Interface를 구현 O --> | ProxyFactory-- Proxy 대상 객체가 Interface를 구현 O --> | ||
| - | ProxyFactory-- Proxy 대상 객체가 Interface를 구현 X --> | + | ProxyFactory-- Proxy 대상 객체가 Interface를 구현 X< |
| p1-- " | p1-- " | ||
| p2-- " | p2-- " | ||
| Line 151: | Line 151: | ||
| * [[# | * [[# | ||
| - | ==== Pointcut | + | === Pointcut === |
| * Filtering 된 [[# | * Filtering 된 [[# | ||
| * 수많은 Business Method 중에서 원하는 특정 Method에서만 [[# | * 수많은 Business Method 중에서 원하는 특정 Method에서만 [[# | ||
| * **Advice가 적용될 __<fc red> | * **Advice가 적용될 __<fc red> | ||
| + | |||
| + | ==== Pointcut Designators ==== | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | Spring AOP 에서 지원하는 Pointcut Designator(PCD)는 아래와 같다. | ||
| + | |||
| + | * execution : Method 실행 join points를 matching. Spring AOP로 작업할 때 가장 우선적인 PCD이다. | ||
| + | * declaring-type-pattern에서 부모 타입 가능 | ||
| + | * param-pattern에서 부모 타입 불가능 | ||
| + | |||
| + | * within : 특정 Type에 join points 적용. | ||
| + | * 부모 타입 불가능. 정확히 맞아야 한다. | ||
| + | * target : target 객체(Spring AOP Porxy가 적용되는 __실제 객체__)를 대상으로 하는 join points 적용 | ||
| + | * 부모 타입 가능. | ||
| + | * this : Spring 빈 객체(Spring AOP __Proxy__)를 대상 | ||
| + | * 부모 타입 가능. | ||
| + | |||
| + | * args : 인자가 주어진 타입의 인스턴스 한정 | ||
| + | * 부모 타입 가능 | ||
| + | |||
| + | |||
| + | * @target : Annotation이 있는 Type에서 부모 타입을 허용하여 모든 Method에 join points 적용 | ||
| + | * @within : Annotation이 있는 Type 내에 있는 Method에 join points 적용. (부모 타입 불가) | ||
| + | |||
| + | * @args : 전달된 실제 arguments의 Runtime type이 주어진 Type의 Annotation이 있는 Join points 적용 | ||
| + | * 부모 타입 허용 | ||
| + | * @annotation : Method가 주어진 Annotation을 갖고 있는 Join points 적용. | ||
| + | |||
| + | <note important> | ||
| + | **args, @args, @target**는 단독으로 사용하면 안된다! | ||
| + | 이 PCD들은 인스턴스가 만들어진 후 Runtime 시점에서 동작한다. | ||
| + | 그러므로 단독으로 사용하면 모든 스프링 빈에 AOP를 적용하려고 시도한다. | ||
| + | 이 때, 스프링 내부에서 사용하는 빈 중에 ' | ||
| + | </ | ||
| + | |||
| + | ===== execution ===== | ||
| + | |||
| + | * [[https:// | ||
| + | *[[https:// | ||
| + | |||
| + | * Pattern | ||
| + | * **< | ||
| + | * **..** : 0..n개 | ||
| + | |||
| + | < | ||
| + | execution(modifiers-pattern? | ||
| + | </ | ||
| + | |||
| + | <sxh java ; gutter: | ||
| + | execution(public app.domain.Member app.repository.Repository.findById(String)) | ||
| + | |||
| + | // - modifiers-pattern : public | ||
| + | // - ret-type-pattern : app.domain.Member | ||
| + | // - declaring-type-pattern : app.repository.Repository | ||
| + | // - name-pattern : findById | ||
| + | // - param-pattern : String | ||
| + | </ | ||
| + | |||
| + | |||
| === Advice === | === Advice === | ||
| * [[# | * [[# | ||
| Line 173: | Line 233: | ||
| - | === Weaving === | + | |
| - | * [[# | + | |
| - | * 컴파일 시점. " | + | |
| - | * 클래스 로딩 시점. | + | |
| - | * 런타임 시점. Proxy 객체 구현 필요 | + | |
| - | * 스프링에서 사용하는 방식. 즉, Method 실행 시점에만 Advisor 동작. | + | |
| === Aspect & Advisor === | === Aspect & Advisor === | ||
| + | |||
| + | < | ||
| + | stateDiagram | ||
| + | state Aspect(Advisor) { | ||
| + | Pointcut | ||
| + | Advice | ||
| + | | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| * 하나의 [[# | * 하나의 [[# | ||
| * [[# | * [[# | ||
| 같은 개념으로, | 같은 개념으로, | ||
| + | |||
| + | |||
| + | === Weaving === | ||
| + | * [[# | ||
| + | * Compile-Time Weaving : " | ||
| + | * Binary Weaving : " | ||
| + | * Runtime Weaving : Class가 JVM에 로드되기 직전에수행. Proxy 객체 구현 필요 | ||
| + | * 스프링에서 사용하는 방식. 즉, Method 실행 시점에만 Advisor 동작. Method는 static이 아니면서 public이어야 한다. | ||