This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| back-end:spring [2022/06/18 16:25] – [Weaving] ledyx | back-end:spring [2024/10/14 00:35] (current) – [Lifecycle Callbacks] ledyx | ||
|---|---|---|---|
| Line 65: | Line 65: | ||
| </ | </ | ||
| - | * 메서드를 구현하고 @PostConstruct, | + | * 메서드를 구현하고 @PostConstruct, |
| Line 90: | Line 90: | ||
| * 원하는 관심사의 유지보수가 수월한 코드를 구성할 수 있다. | * 원하는 관심사의 유지보수가 수월한 코드를 구성할 수 있다. | ||
| * 높은 응집도(같은 목적의 Logic 모여있는 정도)를 위해 사용. | * 높은 응집도(같은 목적의 Logic 모여있는 정도)를 위해 사용. | ||
| + | * **Spring AOP는 AspectJ 라이브러리의 어노테이션 인터페이스만 사용하고, | ||
| 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 === | ||
| * [[# | * [[# | ||
| * 해당 기능이 **언제 동작할 지** 스프링 설정 파일에서 지정한다. | * 해당 기능이 **언제 동작할 지** 스프링 설정 파일에서 지정한다. | ||
| - | === Weaving | + | ==== 종류 |
| - | * [[#Pointcut]]으로 지정한 핵심 관심 Method가 호출될 때,\\ [[# | + | |
| - | * 컴파일 시점. | + | * 전체. 첫 번째 인자가 |
| - | * 클래스 로딩 시점. | + | * @Around |
| - | * 런타임 시점. Proxy 객체 구현 필요 | + | * 부분적. 첫 번째 인자가 |
| - | * 스프링에서 사용하는 방식. 즉, Method 실행 시점에만 Advisor 동작. | + | * @Before : "proceed()" |
| + | * @AfterReturning : "proceed()" | ||
| + | * @AfterThrowing : 오류 발생 (try ~ catch의 catch) | ||
| + | * @After : 모든 작업 수행 후 실행 (try ~ catch의 finally) | ||
| + | |||
| + | 실행 순서는 기술한 순서와 같다. | ||
| + | 만약 @Around 끼리 순서를 지정할 경우 @Order를 | ||
| + | |||
| + | |||
| + | |||
| === Aspect & Advisor === | === Aspect & Advisor === | ||
| + | |||
| + | < | ||
| + | stateDiagram | ||
| + | state Aspect(Advisor) { | ||
| + | Pointcut | ||
| + | Advice | ||
| + | | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| * 하나의 [[# | * 하나의 [[# | ||
| * [[# | * [[# | ||
| - | | + | |
| - | * Aspect | + | 같은 개념으로, |
| - | * Advisor | + | |
| + | |||
| + | === Weaving === | ||
| + | * [[# | ||
| + | * Compile-Time Weaving | ||
| + | * Binary Weaving : " | ||
| + | * Runtime Weaving | ||
| + | * 스프링에서 | ||
| === Core Concerns === | === Core Concerns === | ||