[Spring] Spring AOP - Spring์์๋ AOP๋ฅผ ์ด๋ป๊ฒ ์ด์ฉํ ๊น?
์์ ์ฐ๋ฆฌ๋ AOP(Aspect Oriented Programming, ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ)์ ๋ํ ๊ธฐ๋ณธ๊ณผ ๊ฐ๋ ์ ๋ํด ์์๋ดค์ต๋๋ค. ๋ง์ฝ ์ฝ์ด๋ณด์ง ๋ชปํ๋ค๋ฉด ์ด ๊ธ์ ์ฝ๊ธฐ ์ ๋ฐ๋์ ์ฝ์ด๋ณด์๊ธธ ๊ถ์ฅ๋๋ฆฝ๋๋ค.
2022.05.14 - [Programming/Spring] - [Spring] AOP (Aspect-Oriented Programming) ๊ธฐ๋ณธ๊ณผ ๊ฐ๋
[Spring] AOP (Aspect-Oriented Programming) ๊ธฐ๋ณธ๊ณผ ๊ฐ๋
Spring์๋ AOP(Aspect-Oriented Programming, ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ)์ด๋ผ๋ ํต์ฌ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์? OOP(๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ)๋ผ๋ ๊ฒ์ ๋ค์ด๋ดค๋๋ฐ, AOP๋ ๋ฌด์์ผ๊น์? AOP vs OOP ? ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ
blog.neonkid.xyz
Spring AOP
์์ ๋ค๋ฃฌ ์ผ๋ฐ์ ์ธ AOP์ ๋ง์ฐฌ๊ฐ์ง๋ก Spring AOP ๋ํ ํ๋ก์๋ฅผ ์์ฑํ์ฌ Advice๋ฅผ ์ฃผ์ ํ๋ ๋ฐฉ์์ผ๋ก ์งํ๋ฉ๋๋ค. ๋ค๋ง ์ผ๋ฐ์ ์ธ AOP์ ๋ฌ๋ฆฌ ProxyFactory๋ฅผ ์ด์ฉํด ํ๋ก์๋ก ์๋นํ๋ ๋ฐฉ์์ ์ฌ์ฉํ์ง ์๊ณ , Spring์ด ์ ๊ณตํ๋ ์ ์ธ์ ์ธ AOP ๊ตฌ์ฑ ๋งค์ปค๋์ฆ์ธ ProxyFactoryBean ํด๋์ค์ aop ๋ค์์คํ์ด์ค, @AspectJ ์ด๋ ธํ ์ด์ ์ ๊ฐ์ ์ ์ธ์ AOP ๋งค์ปค๋์ฆ์ ์ฌ์ฉํด ํ๋ก์๋ฅผ ์ ์ธ์ ์ผ๋ก ์์ฑํ์ฌ AOP๋ฅผ ๊ตฌํํฉ๋๋ค.
์ข ๋ ๊ตฌ์ฒด์ ์ผ๋ก ํ๋ก์ ์์ฑ์ด ์ด๋ป๊ฒ ๋๋์ง ์์๋ณด๊ฒ ์ต๋๋ค.
Spring์ ๋ฐํ์ ์์ ์ ApplicationContext(์คํ๋ง์์ Bean์ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด)์ Bean์ ์ ์๋ ํฉ์ด์ง ๊ด์ฌ์ฌ๋ฅผ ๋ถ์ํ๊ณ ProxyBean์ ๋์ ์ผ๋ก ์์ฑํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํธ์ถ์(Caller)์ Target Bean์ ์ฃผ์ ํ์ฌ ์ด๋ฅผ ์ง์ ํธ์ถํ๊ฒ ํ๋ ๋์ ProxyBean์ ์ฃผ์ ํ์ฌ ProxyBean์ด ์คํ ์กฐ๊ฑด(์ฆ, JoinPoint, PointCut, Advice ๋ฑ)์ ๋ถ์ํ๊ณ ์ด์ ๋ฐ๋ผ ์ ์ ํ Advice๋ฅผ ์๋นํ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด Spring AOP๊ฐ ์ผ๋ฐ์ ์ธ AOP ํ๋ก๊ทธ๋๋ฐ๋ณด๋ค ๋ ๋จ์ํ ๋์๋ค๊ณ ํ๋๋ฐ, ์ด๋ป๊ฒ ๋จ์ํ ๋ ๊ฒ์ผ๊น์?
Spring AOP Components
์ฐ๋ฆฌ๋ ์ด์ ๊ธ์์ AOP์ ๊ฐ๋ ๊ณผ ์ฉ์ด๋ฅผ ๋ค๋ค์ต๋๋ค. Spring AOP์์๋ ์ด๋ค ๊ฐ๋ ์ ์ข ๋ ์ฌํํ๊ฒ ๋ง๋ค์๋๋ฐ์. ๊ฐ ์ข ๋ฅ์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
- Spring JoinPoint
Spring AOP์ JoinPoint๋ ์ค์ง ๋ฉ์๋ ํธ์ถ ์กฐ์ธํฌ์ธํธ๋ง์ ์ ๊ณตํ๋ค.
(ํ์ง๋ง ํ์์ ๋ฐ๋ผ AspectJ ๊ฐ์ ๋ค๋ฅธ AOP ๊ตฌํ์ฒด์์ ์ ๊ณตํ๋ ๋ค๋ฅธ ์กฐ์ธ ํฌ์ธํธ๋ ์ฌ์ฉ์ด ๊ฐ๋ฅ) - Spring Aspect
Spring AOP์ Aspect๋ Advisor ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์ ์ธ์คํด์ค์ด๋ค.
Advisor์ ํ์ ์ธํฐํ์ด์ค๋ก PointcutAdvisor์ IntroductionAdvisor ๋ ๊ฐ์ง๊ฐ ์กด์ฌํ๋ค. - Spring Advice
ํน์ ์กฐ์ธํฌ์ธํธ์์ ์คํ๋ ์ฝ๋์ธ Advice๋ฅผ Spring AOP์์๋ ์๋์ ๊ฐ์ด ๊ธฐ๋ณธ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค.
(Before, After-Returning, After(finally), Around, Throws, Introduction)
์ด ์ค์์๋ Around๋ ์ด์ ๊ธ์์ ๋ค๋ค๋ AOP ์ผ๋ผ์ด์ธ์ค ํ์ค์ธ MethodInterceptor๋ฅผ ์ ์ฉํ์๋ค.
์ด์ ๊ธ๊ณผ ์ฝ๋ผ๋ณด๋ ์ด์ ์ ์ง๋ฅผ ์ํด ์์ ์ปดํฌ๋ํธ ์ค Spring Advice๋ฅผ ์ฌ์ฉํ์ฌ ์ข ๋ Spring AOP์ ๋ง๊ฒ ์ฝ๋๋ฅผ ์์ฑํด๋ณด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
Before ์์ ์ ์คํํ ์ฝ๋๋ฅผ ์ ์ํ๊ธฐ ์ํด MethodBeforeAdvice ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์๊ณ , After ์์ ์ ์คํํ ์ฝ๋๋ฅผ ์ ์ํ๊ธฐ ์ํด AfterReturningAdvice๋ฅผ ์ด ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. MethodInterceptor๋ฅผ ์ฌ์ฉํด์๋ ๊ฐ๋จํ ๋ํ๋ผ ์ ์๋ ๊ฒ์ ๋ณ๋์ ํด๋์ค๋ฅผ ์ด์ฉํด ์ ์ํ์ฌ ์๋ก ๋ค๋ฅธ ๊ด์ ์ผ๋ก ์ฝ๋๋ฅผ ์ ์ํ ์ ์๋ ๋ชจ์ต์ ๋๋ค.
ProxyFactory
์ด์ ๊ธ์์๋ ์ด๋ฒ ๊ธ์์๋ ์ฐ๋ฆฌ๋ ProxyFactory๋ฅผ ์ด์ฉํ์ฌ Advice๋ฅผ ์ถ๊ฐํ๊ณ Target ํด๋์ค๋ฅผ ์ถ๊ฐํ์ฌ ๋์ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด๋ด๋ ๊ฒ์ ์์์ต๋๋ค.
์ด์ฒ๋ผ ProxyFactory ํด๋์ค๋ Spring AOP์์ ์๋น๊ณผ ํ๋ก์ ์์ฑ ๊ณผ์ ์ ์ ์ดํ๋ ์ญํ ์ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์ฐ๋ฆฌ๊ฐ ์ด์ ์ ๋ค๋ค๋ ๊ฒ์ฒ๋ผ ๋จ์ผ Target ํด๋์ค, ํ๋์ Advice๋ฅผ ์ ์ฉํ ์๋ ์์ง๋ง ํ๋์ Target ํด๋์ค์ ํด๋นํ๋ ๋ชจ๋ ๋ฉ์๋์๋ ์ ์ฉํด ๋ณผ ์ ์์ต๋๋ค.
๊ทธ ์ธ์๋ ๋์ผํ ProxyFactory๋ฅผ ์ด์ฉํด ๊ฐ๊ธฐ ๋ค๋ฅธ Aspect๋ฅผ ์ ์ฉํ ํ๋ก์๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ง๋ค์ด ๋ณผ ์ ์์ต๋๋ค. ๊ฐ์ Target ํด๋์ค๋ฅผ ๋ฃ์์ง๋ง removeAdvice ๋ฉ์๋๋ฅผ ํตํด ๊ธฐ์กด์ ์ ์ฉํ SimpleBeforeAdvice๋ฅผ ์ ๊ฑฐํ ํ SimpleAfterAdvice๋ง์ ๋ฃ๊ณ , ํ๋ก์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋ฉด ์๋์ ๊ฐ์ ์ถ๋ ฅ์ ๋ชจ์ต์ ๋ณผ ์ ์์ต๋๋ค.
1๋ฒ์งธ ์ถ๋ ฅ์ ์์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๊ณ , 2๋ฒ์งธ ์ถ๋ ฅ์ SimpleBeforeAdvice๋ง์ ์ ์ฉ์์ผฐ์ ๋ ํ๋ก์ ๊ฐ์ฒด, 3๋ฒ์งธ ์ถ๋ ฅ์ ๊ธฐ์กด์ SimpleBeforeAdvice๋ฅผ ์ ๊ฑฐํ๊ณ , SimpleAfterAdvice๋ง์ ์ ์ฉ์์ผฐ์ ๋ ํ๋ก์ ๊ฐ์ฒด์ ๋ชจ์ต์ ๋๋ค.
Spring AOP Proxy
์์ Proxy๋ Target ํด๋์ค๋ฅผ ๊ฐ์ธ ์์ฒญ์ ๋์ ๋ฐ์์ฃผ๋ Wrapping ํด๋์ค๋ผ๋ ๊ฒ์ ์์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด Proxy๋ Weaving์ ํตํด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋๋ฐ, Spring AOP๋ ์ด๋ฌํ ์์ฑ ๊ณผ์ ์ ์๋์ ๋ ๊ฐ์ง๋ก ํํํฉ๋๋ค.
- CGLib Proxy
- JDK Dynamic Proxy
์๋ฅผ ๋ค๋ฉด OrderService๋ผ๋ ์ฃผ๋ฌธ์ ๊ด๋ฆฌํ๋ ๋น์ฆ๋์ค ๋ก์ง ํด๋์ค๊ฐ ์์ต๋๋ค. ํด๋น ํด๋์ค์๋ ์๋ก์ด ์ฃผ๋ฌธ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ save ๋ฉ์๋๊ฐ ์๋๋ฐ, ์ค์ ๋ก Spring์ด ์ด ํด๋์ค์ ์๋ save ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ OrderService ๊ฐ์ฒด์ ๋ฐ๋ก ์ ๊ทผํ๋ ๊ฒ์ด ์๋๋ผ weaving์ผ๋ก ์์ฑ๋ ํ๋ก์๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ์ ๊ทผํ๋ ๊ฒ์ ๋๋ค.
Spring AOP๋ AspectJ์ ๋ฌ๋ฆฌ Load-Time Weaving์ ์ฌ์ฉํ์ง ์๊ณ Run-Time Weaving ๊ธฐ๋ฒ์ ์ฌ์ฉํฉ๋๋ค. ์์ ์ค๋ช ํ ๋ ๊ฐ์ง ํ๋ก์ ์์ฑ ๋งค์ปค๋์ฆ ์ค CGLIB Proxy๋ Run-Time Weaving์ ์ฌ์ฉํ๋ ํ๋ก์์ด๊ณ , Spring AOP๊ฐ ์ฌ์ฉํ๋ ํ๋ก์ ์์ฑ์ ๊ธฐ๋ณธ์ ์ผ๋ก CGLIB Proxy๋ฅผ ์ฌ์ฉํฉ๋๋ค.
JDK Proxy์ CGLib Proxy์ ๊ฒฐ์ ์ ์ธ ์ฐจ์ด์ ์ ๋ฐ๋ก ์ธํฐํ์ด์ค๋ฅผ Proxy ๊ฐ์ฒด๋ก ํ๋, ํด๋์ค๋ฅผ Proxy ๊ฐ์ฒด๋ก ํ๋์ ์ฐจ์ด์ธ๋ฐ์. ๊ณผ๊ฑฐ์๋ Interface๋ก ๋จผ์ ๊ตฌํ ์คํ์ ๊ฐ์ถ ๋ค์ class๋ก ๊ตฌํํ๋ OOP๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ง๊ธ์ ๋ฐ๋ก class๋ก ์ ์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ, ์ด์ ๋ฐ๋ผ์ Spring์์๋ JDK Proxy๋ฅผ ์ฌ์ฉํ ์ง CGLib Proxy๋ฅผ ์ฌ์ฉํ ์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
CGLib Proxy
CGLIb๊ฐ Proxy๋ฅผ ์ปดํ์ผ ํ์์ด ์๋ ๋ฐํ์ ์์ ์ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ๊น์ง ์์์ง๋ง ์ค์ ๋ก ์ด๋ป๊ฒ ๊ตฌ๋๋๋์ง ์๋ฉด ๋ ์ข๊ฒ ์ฃ ?
์ด์ ๊ธ์์ ์ฐ๋ฆฌ๋ MethodInterceptor๋ฅผ ํตํด Advice๋ฅผ ๋ง๋ค๊ณ , ProxyFactory๋ฅผ ํตํด ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํ์๋๋ฐ์. ์ด ๊ณผ์ ์ ํ๋๋ก ๋ฌถ์ ๋ชจ๋์ด ๋ฐ๋ก Enhancer์ ๋๋ค.
์๋ก์ด ํ๋ก์๋ฅผ ํ๋ ๋ง๋ค๊ณ ์๋๋ฐ์. ์ด ๋ ์ฐ๋ฆฌ๊ฐ ์ฃผ์ด์ค Target ํด๋์ค๋ฅผ superClass๋ก ์ฃผ๋ ๊ฒ์ ๋ณด์ ํด๋น ํ๋ก์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋ ์ด๋ฅผ ์์ํ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ , ๋ง๋ค์ด์ง ํ๋ก์ ๊ฐ์ฒด๋ก ์์ฒญ์ด ๋ค์ด์์ ๋ ๊ทธ ์์ฒญ์ ๊ฐ๋ก์ฑ์ ๋จผ์ ์ํํ ๋ก์ง์ ์ฐ๋ฆฌ๊ฐ ์ ์ํ Advice ๋ก์ง์ผ๋ก ๋จผ์ ๊ฐ ํ ์ค์ ๊ฐ์ฒด์ ์์ฒญ์ ์ ๋ฌํ ๋ค์, ๋์์ฌ ๋๋ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค.
๋ง์ง๋ง์ผ๋ก create ๋ฉ์๋๋ฅผ ์ด์ฉํด ๋ง๋ค์ด์ง ํ๋ก์ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
create ๋ฉ์๋๋ฅผ ๋ณด๋ฉด Target ํด๋์ค ํ์ ์ ์ ์ํ๊ณ ํ์ง ์๊ณ ์ ๋ฉ์๋๊ฐ ์ค๋ฒ๋ก๋ฉ ๋ ๊ฑฐ ์ธ์๋ ๋ณ๋ค๋ฅธ ๊ฒ์ด ์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ ์ค์ ํ๋ก์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ๋ฉ์๋๋ non-static create ๋ฉ์๋์ด๋ฉฐ ์ด ๋ฉ์๋๋ ๋ณด๋ฉด...
์ด ๋ฉ์๋์ 320๋ฒ์งธ ์ค์ ๋ณด๋ฉด Target ํด๋์ค๋ค์ ํ์ ์ ๊ฐ์ ธ์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ,
์ค์ ๋ก ์ฝ๋๋ฅผ ๋ณด๋ฉด classOnly ํ๋๊ทธ๊ฐ ์ฃผ์ด์ง ๊ฒฝ์ฐ๋ ๋จ์ํ ํด๋์ค ํ์๋ง์ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ๋ Reflection์ ์ด์ฉํด ํด๋์ค๋ฅผ ๋ถ์ํ๊ณ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋ฐํํ๋ ๋ชจ์ต์ ๋ณผ ์ ์์ต๋๋ค.
ํด๋์ค ์์ฑ์์ ํ๋ผ๋ฏธํฐ ๊ฐ์ด ์์ผ๋ฉด newInstasnce ๋ฉ์๋๋ฅผ ๋ถ๋ฅผ ๋ ํ๋ผ๋ฏธํฐ ํ์ ๊ณผ ํ๋ผ๋ฏธํฐ ๊ฐ์ ์ฃผ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ๋น๊ฐ๊ณผ ๋น ๋ฐฐ์ด๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํด ๋ฐํํฉ๋๋ค.
ํ์ง๋ง ์ฐ๋ฆฌ๋ ์ ์ฝ๋์์ create ๋ฉ์๋๋ฅผ ํธ์ถํ์ ๋ ์ด๋ฏธ argumentType์ด null์ด ๋๊ณ ์์์ ํ์ธํ์ต๋๋ค.
๋ฐ๋ผ์ ๋น ์์ฑ์๋ก ๋ (argument๊ฐ ๋ชจ๋ null์ธ) ํ๋ก์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ฃผ๋ ๊ฒ์ผ๋ก ๋ฐํ์ ์์ ์ ๋ง๋ค์ด์ง๋ ๊ฒ์ ๋๋ค.
๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ฝํ๋ฆฐ์ plugin์ ํตํด์ ์ปดํ์ผ ์์ ์ ๋ชจ๋ ํด๋์ค์ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ๋ง๋ค์ด์ฃผ๋๋ก ํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณผ ์ ์์ต๋๋ค.
๋ณธ๋ Spring์ Default Constructor(๊ธฐ๋ณธ ์์ฑ์)๊ฐ ํ์ํฉ๋๋ค. ์๋ํ๋ฉด ๋ชจ๋ ๊ฐ์ฒด๋ค์ด Proxy ๊ฐ์ฒด๋ก ์ ๊ทผํ๋๋ฐ, Spring AOP๊ฐ ์ฌ์ฉํ๋ CGLib Proxy๋ ์ค์ค๋ก Default Constructor๋ฅผ ์์ฑํ์ง ๋ชปํฉ๋๋ค. ๊ทธ๋์ Spring 4.x ๋ฒ์ ๋ถํฐ๋ Objenesis ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด ๊ธฐ๋ณธ ์์ฑ์๋ฅผ CGLib์์ ์์ฑํ ์ ์๋๋ก ๋์์ค๋๋ค.
Objenesis : About
About Objenesis is a small Java library that serves one purpose: To instantiate a new object of a particular class. When would you want this? Java already supports this dynamic instantiation of classes using Class.newInstance(). However, this only works if
objenesis.org
์ด๋ฐ ๋ฌธ์ ๊ฐ ์์์๋ ๋ถ๊ตฌํ๊ณ , Spring AOP๊ฐ CGLib Proxy๋ฅผ ๊ณ์ ๊ณ ์งํ๋ ์ด์ ๋ JDK Dynamic Proxy์ ๋นํด ์ฑ๋ฅ์ด ์ข๊ธฐ ๋๋ฌธ์ ๋๋ค. JDK Dynamic Proxy๋ ๊ธฐ๋ณธ์ ์ผ๋ก Java Reflection์ ์ด์ฉํ๋ฉฐ ์ด๋ ๊ฝค ๋ง์ ์๊ฐ ๋น์ฉ์ ์๋ชจํฉ๋๋ค.
(๊ทธ๋ฆฌ๊ณ ํ์ฌ๋ CGLib Proxy๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฌธ์ ๋ค ๋๋ถ๋ถ์ ๊ฐ์ ํ์์)
๋ง์ง๋ง์ผ๋ก Kotlin์ ๊ธฐ๋ณธ์ ์ผ๋ก final class(์์์ด ์๋๋ ํด๋์ค)๋ก ์ฝ๋๋ฅผ ์ ์ํ๋๋ฐ, ์๋๋ผ๋ฉด ๊ฐ๋ฐ์๊ฐ ์ง์ ํด๋์ค๋ฅผ ๊ตฌํํ ๋๋ง๋ค open ํค์๋๋ฅผ ๋ถ์ฌ์ค์ผ ํฉ๋๋ค.
ํ์ง๋ง ์ด ๋ํ plugin์ ์ฌ์ฉํด ๋ณผ ์ ์๋๋ฐ, allopen ์ด๋ผ๋ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ฉด ์ปดํ์ผ ์์ ์ ๋ชจ๋ ํด๋์ค๋ค์ open class๋ก ๋ฐ๊ฟ ์ปดํ์ผํ๋ ํ๋ฌ๊ทธ์ธ์ ๋๋ค. ์ฐจํ ์ด ํ๋ฌ๊ทธ์ธ์ plugin.spring์ด๋ผ๋ ๊ฒ์ ํก์๋๊ณ , ์ฝํ๋ฆฐ + ์คํ๋ง ์กฐํฉ์ ์ฌ์ฉํ ๋ ํ์ํ ๋ชจ๋ plugin์ผ๋ก ๊ด๋ฆฌ๋์ด ์ฌ์ฉํด ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ์ ๋๋ค.
๋ง์น๋ฉฐ..
๊ธฐ๋ณธ์ ์ผ๋ก ํ์ค AOP์ Spring AOP์ ๋ชจ์ต์ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ต๋๋ค. ํ์ง๋ง ํ์ค AOP ์ธํฐํ์ด์ค๋ก ๊ตฌํํ ์ ์๋ ํ๋ก๊ทธ๋๋ฐ ํ๋ค์ ๋ฎ์ถ๊ณ ์ต๋ํ ๊ฐ์ํ๋ ๋ชจ์ต์ ๋ณด์ฌ์คฌ์ต๋๋ค.
์ด ๊ธ์ ํตํด์ ์ด๊ธฐ Kotlin์ด ์ Spring๊ณผ ์ตํํ๊ธฐ ์ด๋ ค์ ๋์ง๋ฅผ ์ ์ ์์ต๋๋ค. Spring์ ์ผ๋ฐ Java์ ๋ฌ๋ฆฌ ๊ฐ์ฒด ์ ๊ทผ ๋ฐฉ๋ฒ์ด๋ ์์ฑ ๋ฐฉ๋ฒ ๋ฑ์ด ๋ค๋ฅด๊ณ , ์ฌ์ง์ด Kotlin์ ํด๋์ค ๊ตฌํ๊ณผ Java์ ํด๋์ค ๊ตฌํ ์ญ์ ๋ฌ๋๊ธฐ ๋๋ฌธ์ ์ด์ฐฝ๊ธฐ ์ฝํ๋ฆฐ ์ธ์ด๋ก Spring์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ต์ฅํ ์ด๋ ค์ด ์ผ์ด๋ ๊ฒ์ด์ฃ .
๋ค์ ๊ธ์์๋ Spring AOP ์ปดํฌ๋ํธ ์ค Spring Advice๋ฅผ ์ข ๋ ์์ธํ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.