Skip to content

Commit 44e5b09

Browse files
committed
Feat - edit aop
1 parent 0d763d6 commit 44e5b09

File tree

1 file changed

+90
-90
lines changed

1 file changed

+90
-90
lines changed

spring/spring-aop.md

+90-90
Original file line numberDiff line numberDiff line change
@@ -38,77 +38,77 @@ AOP를 사용하면 위와같이 전역적으로 발생할 수 있는 공통 기
3838

3939
AOP 용어들 스프링에서만 사용되는게 아니라 AOP 프레임워크 전체에서 사용되는 용어들.
4040

41-
> ### Target Object
42-
>
43-
> 부가기능을 부여할 대상, ex) CategoryService 등.. 대개 스프링에서는 Service 쪽이 해당.
44-
>
45-
> 스프링에서는 Runtime Weaving을 통해 프록시 된 객체들이 대상 객체에 해당한다.
46-
>
47-
> ### Advice
48-
>
49-
> 실질적인 부가기능을 담은 구현체 Aspect가 언제 적용 될 지를 정의하고 있다.
50-
>
51-
> ```java
52-
> @Around("execution(* codesquad.service.BestCategoryService.findAll(..))")
53-
> ```
54-
>
55-
> 위에서 **@Around에 해당하는 부분이 Advice**. 필요에 따라 아래와 같은 여러 어노테이션을 통해 적용 시점을 변경할 수 있다.
56-
>
57-
> - **@Before**
58-
> - 메소드 실행 전 기능 수행.
59-
> - **@After**
60-
> - 메소드 결과와 상관없이 메소드가 완료 된 이후에 기능 수행.
61-
> - **@AfterReturning**
62-
> - 메소드가 성공적으로 완료 된 이후에 기능 수행.
63-
> - **@AfterThrowing**
64-
> - 메소드 수행 중 예외 발생 시 이후에 기능 수행.
65-
> - **@Around**
66-
> - 메소드가 실행되기 전과 후 기능 구행. proceed() 메소드 호출 전, 후를 통해 구분할 수 있다.
67-
>
68-
> ### Pointcut
69-
>
70-
> 부가기능이 적용될 대상을 선정하는 방법을 정의한 모듈, 스프링은 기본적으로 AspectJ 포인트컷 표현식 언어를 사용한다.
71-
>
72-
> Pointcut 표현식에 맞고, JoinPoint에 해당하는 지점에서 해당 Aspect가 실행된다.
73-
>
74-
> ![](/images/spring/pointcut.png)
75-
>
76-
> 포인트컷 표현식은 위와 같은 구조를 가지고 있다. execution은 포인트컷 지정자로 다른 것도 많지만 생략.
77-
>
78-
> ```java
79-
> @Pointcut("execution(* codesquad.service.BestCategoryService.findAll(..))")
80-
> public void findAllBestCategory(){}
81-
>
82-
> @Pointcut("execution(* codesquad.service.BestCategoryService.find(..))")
83-
> public void findBestCategory(Long categoryId){}
84-
>
85-
> @Around("findAllBestCategory() || findBestCategory()")
86-
> public Object calculatePerformanceTime(Pr
87-
> ```
88-
>
89-
> 위처럼 @Pointcut을 이용해 재사용 가능한 포인트컷을 등록, 사용할 수도 있고 관계연산자를 이용해 여러 포인트컷을 적용할수도 있다.
90-
>
91-
> ### Aspect
92-
>
93-
> 부가기능 모듈, 객체지향의 객체처럼 AOP의 한 기능을 가지는 모듈 스프링에서는 @Aspect 어노테이션을 통해 구현할 수 있다.
94-
>
95-
> ### JoinPoint
96-
>
97-
> 메소드 실행이나 예외 처리, 필드값 수정 등에 대한 지점을 나타낸다. Spring AOP에서는 메소드 실행에 대한 JoinPoint만 지원한다.
98-
>
99-
> ### Weaving
100-
>
101-
> Aspect가 지정된 객체를 새로운 프록시 객체를 생성하는 과정.
102-
>
103-
> ![](/images/spring/cglib.png)
104-
>
105-
> 위처럼 CategoryService라는 객체 이외에 CGLIB 프록시 객체가 생성되기 위한 과정을 의미한다.
106-
>
107-
> Compile-time Weaving, Load-time weaving, Run-time weaving 세가지 방식의 Weaving이 존재하고. 스프링 AOP에서는 CGLIB Proxy, JDK Dynamic Proxy를 이용한 Run-time weaving 방식을 제공한다.
108-
>
109-
> ### Proxy
110-
>
111-
> 타겟을 감싸서 요청을 대신 받아주는 랩핑 클래스. Weaving을 통해서 Proxy 객체를 생성하며 Spring AOP ProxyCGLIB Proxy, JDK Dynamic Proxy를 사용한다. 스프링의 AOP는 이 프록시 객체를 통해 작동하게 된다.
41+
### Target Object
42+
43+
부가기능을 부여할 대상, ex) CategoryService 등.. 대개 스프링에서는 Service 쪽이 해당.
44+
45+
스프링에서는 Runtime Weaving을 통해 프록시 된 객체들이 대상 객체에 해당한다.
46+
47+
### Advice
48+
49+
실질적인 부가기능을 담은 구현체 Aspect가 언제 적용 될 지를 정의하고 있다.
50+
51+
```java
52+
@Around("execution(* codesquad.service.BestCategoryService.findAll(..))")
53+
```
54+
55+
위에서 **@Around에 해당하는 부분이 Advice다**. 필요에 따라 아래와 같은 여러 어노테이션을 통해 적용 시점을 변경할 수 있다.
56+
57+
- **@Before**
58+
- 메소드 실행 전 기능 수행.
59+
- **@After**
60+
- 메소드 결과와 상관없이 메소드가 완료 된 이후에 기능 수행.
61+
- **@AfterReturning**
62+
- 메소드가 성공적으로 완료 된 이후에 기능 수행.
63+
- **@AfterThrowing**
64+
- 메소드 수행 중 예외 발생 시 이후에 기능 수행.
65+
- **@Around**
66+
- 메소드가 실행되기 전과 후 기능 구행. proceed() 메소드 호출 전, 후를 통해 구분할 수 있다.
67+
68+
### Pointcut
69+
70+
부가기능이 적용될 대상을 선정하는 방법을 정의한 모듈, 스프링은 기본적으로 AspectJ 포인트컷 표현식 언어를 사용한다.
71+
72+
Pointcut 표현식에 맞고, JoinPoint에 해당하는 지점에서 해당 Aspect가 실행된다.
73+
74+
![](/images/spring/pointcut.png)
75+
76+
포인트컷 표현식은 위와 같은 구조를 가지고 있다. execution은 포인트컷 지정자로 다른 것도 많지만 생략.
77+
78+
```java
79+
@Pointcut("execution(* codesquad.service.BestCategoryService.findAll(..))")
80+
public void findAllBestCategory(){}
81+
82+
@Pointcut("execution(* codesquad.service.BestCategoryService.find(..))")
83+
public void findBestCategory(Long categoryId){}
84+
85+
@Around("findAllBestCategory() || findBestCategory()")
86+
public Object calculatePerformanceTime(Pr
87+
```
88+
89+
위처럼 @Pointcut을 이용해 재사용 가능한 포인트컷을 등록, 사용할 수도 있고 관계연산자를 이용해 여러 포인트컷을 적용할수도 있다.
90+
91+
### Aspect
92+
93+
부가기능 모듈, 객체지향의 객체처럼 AOP의 한 기능을 가지는 모듈 스프링에서는 @Aspect 어노테이션을 통해 구현할 수 있다.
94+
95+
### JoinPoint
96+
97+
메소드 실행이나 예외 처리, 필드값 수정 등에 대한 지점을 나타낸다. Spring AOP에서는 메소드 실행에 대한 JoinPoint만 지원한다.
98+
99+
### Weaving
100+
101+
Aspect가 지정된 객체를 새로운 프록시 객체를 생성하는 과정.
102+
103+
![](/images/spring/cglib.png)
104+
105+
위처럼 CategoryService라는 객체 이외에 CGLIB 프록시 객체가 생성되기 위한 과정을 의미한다.
106+
107+
Compile-time Weaving, Load-time weaving, Run-time weaving 세가지 방식의 Weaving이 존재하고. 스프링 AOP에서는 CGLIB Proxy, JDK Dynamic Proxy를 이용한 Run-time weaving 방식을 제공한다.
108+
109+
### Proxy
110+
111+
타겟을 감싸서 요청을 대신 받아주는 랩핑 클래스. Weaving을 통해서 Proxy 객체를 생성하며 Spring AOP ProxyCGLIB Proxy, JDK Dynamic Proxy를 사용한다. 스프링의 AOP는 이 프록시 객체를 통해 작동하게 된다.
112112

113113
## Spring Proxy
114114

@@ -186,25 +186,25 @@ Weaving이란 지정된 객체에 Aspect를 부여해서 새로운 프록시 객
186186

187187
아래와 같은 3가지 방법의 Weaving을 제공한다. Spring AOP는 기본적으로 무조건 Run-time weaving으로 동작한다.
188188

189-
> ### Run-time weaving
190-
>
191-
> Spring AOP에서 사용하는 weaving 방식. **스프링에서는 Run-time weaving을 통해 CGLIB Proxy 혹은 JDK Dynamic Proxy를 생성**한다.
192-
>
193-
> ### Load-time weaving
194-
>
195-
> 일반적으로 사용되는 Spring AOP가 아닌 AspectJ 라이브러리를 추가하여 사용해야 한다.
196-
>
197-
> 객체를 Load 할때, AspectJ에 의해서 weaving된 객체를 넘겨주는 방식.
198-
>
199-
> applicationContext에 로드된 객체들을 불러온 뒤, Aspectj weaver에 의해 객체들을 weaving한다고 함. 객체들을 다 불러온 뒤 weaving을 하기 때문에 약간의 퍼포먼스 하락이 있다고 한다.
200-
>
201-
> ### Compile-time weaving
202-
>
203-
> 일반적으로 사용되는 Spring AOP가 아닌 AspectJ 라이브러리를 추가하여 사용해야 한다.
204-
>
205-
> Compile 시에 Aspectj에서 필요한 객체 weaving을 통해 클래스를 생성하는 방식이다. 위의 Load-time에 대한 절차가 없어서 퍼포먼스 하락 없이 구성이 가능하다.
206-
>
207-
> 다만 Lombok과 같이 compile시 간섭하는 plugin들과 충돌이 발생한다고 함. 자바 8 기반 코드들에서 Lombok을 사용하지 않는 경우는 거의 없다고 봐도 되기 때문에 사실상 사용이 힘들듯?
189+
### Run-time weaving
190+
191+
Spring AOP에서 사용하는 weaving 방식. **스프링에서는 Run-time weaving을 통해 CGLIB Proxy 혹은 JDK Dynamic Proxy를 생성**한다.
192+
193+
### Load-time weaving
194+
195+
일반적으로 사용되는 Spring AOP가 아닌 AspectJ 라이브러리를 추가하여 사용해야 한다.
196+
197+
객체를 Load 할때, AspectJ에 의해서 weaving된 객체를 넘겨주는 방식.
198+
199+
applicationContext에 로드된 객체들을 불러온 뒤, Aspectj weaver에 의해 객체들을 weaving한다고 함. 객체들을 다 불러온 뒤 weaving을 하기 때문에 약간의 퍼포먼스 하락이 있다고 한다.
200+
201+
### Compile-time weaving
202+
203+
일반적으로 사용되는 Spring AOP가 아닌 AspectJ 라이브러리를 추가하여 사용해야 한다.
204+
205+
Compile 시에 Aspectj에서 필요한 객체 weaving을 통해 클래스를 생성하는 방식이다. 위의 Load-time에 대한 절차가 없어서 퍼포먼스 하락 없이 구성이 가능하다.
206+
207+
다만 Lombok과 같이 compile시 간섭하는 plugin들과 충돌이 발생한다고 함. 자바 8 기반 코드들에서 Lombok을 사용하지 않는 경우는 거의 없다고 봐도 되기 때문에 사실상 사용이 힘들듯?
208208

209209
## Spring AOPAspectJ의 차이점
210210

0 commit comments

Comments
 (0)