Advisor = @Aspect = Advice + PointCut
JDK Dynamic Proxy
โข
Proxy ๊ฐ์ฒด - Invocation Handler ๋ฅผ ๋ณ์๋ก ๊ฐ์ง๋ค
โข
reflection ์ ์ด์ฉ
โข
์บ์คํ
๋ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ์คํํ๋ฉด Proxy ์ invoke ๊ฐ ๋จผ์ ๋ฐ์(Proxy -1 ํ ์คํ)
๋ฌธ์ ์
โข
interface ๊ฐ ๋ฐ๋์ ์กด์ฌํด์ผํ๋ค
โฆ
์ด๋ ํ ์์ ์์ ๋ฐ๋์ interface ๋ก์ ํธ์ถ๋์ด์ผ ํ๋ค.
โข
reflection ์ด๋ผ์ ๋ฌด๊ฒ๋ค.
โข
invoke ๋ฉ์๋๊ฐ ์๋นํ ์ ํ์ ์ด๋ค.
CGLIB
โข
ProxyFactoryBean vs Enhancer
โฆ
EnhancerBySpringCGLIB vs EnhancerByCGLIB
โฆ
implements ํ๋ MethodInterceptor ๊ฐ ๋ค๋ฅด๋ค
โช
org.aopalliance.intercept.MethodInterceptor;
โช
org.springframework.cglib.proxy;
โฆ
@Transactional ์ ํ๋ก์๋ค์ ๋๋ถ๋ถ EnhancerBySpringCGLIB or Dynamic Proxy(interface ๊ฐ ์๋ ์ ๋ค) ์ด๋ค.
ProxyFactoryBean
โข
Aop ๊ฐ ๊ฑธ๋ฆฐ Bean์ ๋ฑ๋กํ ๋ ๋ฑ๋ก๋๋ค.
โข
ํด๋น ๊ฐ์ฒด์ ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋ CGLIB ๊ฐ์ฒด์ ๋ฉ์๋๊ฐ ํธ์ถ๋๊ณ (-1ํ)
โข
DynamicAdvisedInterceptor ๊ฐ ๋์ํ๋ค. ์๊ฐ ๋ฑ๋ก๋ advisor ๋ค ์คํ์ํจ๋ค.
โข
advisor ๋ฅผ ๊ฐ์ ํ๋ ๊ฒ ๊ฐ๋ค โ ์ด๋ ์ถํ์ ์ฐจ์ฐจ ์์๋ณด์!
AspectJ
โข
implementation group: 'org.springframework', name: 'spring-aop', version: '5.2.22.RELEASE'
โข
์ํตํจ
โข
Bean named 'userService' is expected to be of type 'aop.stage2.UserService' but was actually of type 'com.sun.proxy.$Proxy71โ
์ด ์๋ฌ ๊ณ์ ๋จ
โข
UserService ๋ @Component ๋ถ์ธ ํด๋์ค
โข
aop ๊ด๋ จ implementation ํจ
โข
โข
Component ๋ EnhancerBySpringCglib ์ด๋ค.
AspectJ: AOP ๊ธฐ์ ์ ์์กฐ, ๊ฐ์ฅ ๊ฐ๋ ฅํ AOP ํ๋ ์์ํฌ
AspectJ ์์ฒด๋ Proxy ๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค.
์คํ๋ง๋ AspectJ ์ ํฌ์ธํธ์ปท ํํ์์ ์ฐจ์ฉํด์ ์ฌ์ฉ
ํ๋ก์ ๋ฐฉ์๋ณด๋ค ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ AOP ๊ฐ ๊ฐ๋ฅ
โข
์ค๋ธ์ ํธ ์์ฑ, ํ๋ ๊ฐ์ ์กฐํ์ ์กฐ์, ์คํํฑ ์ด๊ธฐํ ๋ฑ ๋ค์ํ ์์
์ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ๋ถ์ฌ
Service ๋ CGLIB, Repository ๋ JDK Dynamic Proxy!
์ด์ ๋ Proxy ์์ฑ์ if ์ ์ interface ๊ฐ ์๋์ง ํ์ธํจ. ์์ผ๋ฉด JDK Dynamic Proxy ๋ก ์์ฑํด๋ฒ๋ฆผ
๊ทผ๋ฐ JDK Dynamic Proxy ์ด๋ค. ๊ทธ๋์ ์๋ invoke handler ๊ฐ ์๋๊ณ advisor ๋ก ๋๋ค.
@Transactional
โข
ProxyFactoryBean ์ผ๋ก ์์ฑ๋ SpringCGLIB ์ ์ด์ฉํ๋ค
โข
advisor ๋ BeanFactoryTransactionAttributeSourceAdvisor
โฆ
advice ๋ TransactionInterceptor
โฆ
pointcut ์ TransactionAttributeSourcePointcut