์ฉ์ด | ์ค๋ช |
---|---|
Target | ํต์ฌ๊ธฐ๋ฅ์ ๋ด๊ณ ์๋ ๋ชจ๋๋ก target์ ๋ถ๊ฐ๊ธฐ๋ฅ์ ๋ถ์ฌํ ๋์์ด ๋จ ์ฌ๊ธฐ์ ๋งํ๋ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ๋น์ฆ๋์ค ๋ก์ง์ ์ ์ธํ ๋ถ๊ฐ๋ฅผ ์๋ฏธํ๋ค๊ณ ๋ณผ ์ ์๋ค. |
Advice | ์ด๋ ์์ ์ ์ด๋ค ๊ณตํต ๊ด์ฌ ๊ธฐ๋ฅ์ ์ ์ฉํ ์ง ์ ์ ํ ๊ฒ์ด๋ค. Target์ ์ ๊ณตํ ๋ถ๊ฐ๊ธฐ๋ฅ์ ๋ด๊ณ ์๋ ๋ชจ๋ |
JoinPoint | Aspect๊ฐ ์ ์ฉ ๋ ์ ์๋ ์ง์ (method, field) ์ฆ, target ๊ฐ์ฒด๊ฐ ๊ตฌํํ ์ธํฐํ์ด์ค์ ๋ชจ๋ method๋ JoinPoint๊ฐ ๋จ ์ค์ง์ ์ผ๋ก Spring์์๋ method์์๋ง ์ง์์ ํด์ฃผ๋ฉฐ Spring์์๋ Runtime ์์ ์์๋ง ์ง์์ ํด์ค Pointcut์ ํ๋ณด๊ตฐ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค. |
Pointcut | ๊ณตํต ๊ด์ฌ ์ฌํญ์ด ์ ์ฉ๋ JoinPoint์ผ๋ก ๋ณผ ์ ์๋ค. Advice๋ฅผ ์ ์ฉํ target์ method๋ฅผ ์ ๋ณํ๋ ์ ๊ท ํํ์์ผ๋ก์ Pointcut ํํ์์ execution์ผ๋ก ์์ํ๊ณ method์ Signature๋ฅผ ๋น๊ตํ๋ ๋ฐฉ๋ฒ์ ์ฃผ๋ก ์ด์ฉ |
Aspect | ์ฌ๋ฌ ๊ฐ์ฒด์์ ๊ณตํต์ผ๋ก ์ ์ฉ๋๋ ๊ณตํต ๊ด์ฌ ์ฌํญ(transaction, logging, securityโฆ.) AOP์ ๊ธฐ๋ณธ ๋ชจ๋ Aspect๋ Singleton ํํ์ ๊ฐ์ฒด๋ก ์กด์ฌ |
Advisor | Advice + pointcut, Advisor๋ Spring AOP์์๋ง ์ฌ์ฉ๋๋ ํน๋ณํ ์ฉ์ด |
Weaving | ์ด๋ค Advice๋ฅผ ์ด๋ค Pointcut์ ์ ์ฉ์ํฌ ๊ฒ์ธ์ง์ ๋ํ ์ค์ , ์ฆ Pointcut์ ์ํด์ ๊ฒฐ์ ๋ ํ๊ฒ์ JoinPoint์ ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ฝ์ ํ๋ ๊ณผ์ ์ ๋ปํจ AOP์ ํต์ฌ๊ธฐ๋ฅ์ ์ฝ๋์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉด์ ํ์ํ ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ํด์ฃผ๋ ํต์ฌ์ ์ธ ์ฒ๋ฆฌ ๊ณผ์ |
ํ๋ก์๋ผ๋ ๊ฐ๋ ์ ๋ญ๋ผ๊ณ ์ดํดํ๋ฉด ์ข์๊น?
Spring์ Target ๊ฐ์ฒด์ ๋ํ Proxy๋ฅผ ๋ง๋ค์ด ์ ๊ณตํ๋๋ฐ Target์ ๊ฐ์ธ๋ Proxy๋ ์คํ์๊ฐ ์ฆ Runtime์ ์์ฑ๋๋ค. Proxy๋ Advice๋ฅผ Target ๊ฐ์ฒด์ ์ ์ฉํ๋ฉด์ ์์ฑ๋๋ ๊ฐ์ฒด๋ผ๊ณ ๋ณผ ์ ์๋ค. Advice? ๋ถ๊ฐ ๊ธฐ๋ฅ์ ๋ด๊ณ ์๋ ๋ชจ๋
ํ๋ก์๋ ํ๊ฒ์ ๊ฐ์ธ์ ํ๊ฒ์ ์์ฒญ์ ๋์ ๋ฐ์์ฃผ๋ Wrapping Object, Client์์ Target์ ํธ์ถํ๊ฒ ๋๋ฉด ํ๊ฒ์ด ์๋ ํ๊ฒ์ด ๊ฐ์ธ๊ณ ์๋ Proxy๊ฐ ํธ์ถ๋จ ์ด ๋ ํ๋ก์๋ ํ๊ฒ ๋ฉ์๋ ์คํ ์ ํ๋ก ๋ถ๊ฐ ๊ธฐ๋ฅ์ ์คํํ๋๋ก ๊ตฌ์ฑ๋์ด ์๋ค. ํ๋ก์ ํจํด์ ํ๊ฒ ํ๋ ํ๋๋ง๋ค ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์ ์ํด์ผํ๋ฏ๋ก ๋ฒ๊ฑฐ๋กญ๊ณ ์ฝ๋์ ์ค๋ณต์ด ์๊ธด๋ค๋ ์ ์ด ์์. ๊ทธ๋์ Spring AOP์์๋ Runtime JDK Dynamic Proxy or CGLIB๋ฅผ ํ์ฉํ์ฌ ํ๋ก์๋ฅผ ์์ฑ.
๐ Spring์ AOP ํ๋ก์๋ฅผ ์์ฑํ๋ ๊ณผ์ ์์ ์์ฒด ๊ฒ์ฆ ๋ก์ง์ ํตํด ํ๊ฒ์ ์ธํฐํ์ด์ค ์ ๋ฌด๋ฅผ ํ๋จํ๋ค. ์ด๋ ํ๊ฒ์ด ํ๋ ์ด์์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์๋ Class๋ผ๋ฉด JDK Dynamic Proxy๋ฅผ ์ฌ์ฉํ๊ณ ์๋๋ฉด CGLIB์ ๋ฐฉ์์ผ๋ก AOP ํ๋ก์๋ฅผ ์์ฑํจ
Code Generator Library์ ์ฝ์๋ก, ํด๋์ค์ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์กฐ์ํ์ฌ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. CGLIB๋ฅผ ์ฌ์ฉํ๋ฉด ์ธํฐํ์ด์ค๊ฐ ์๋ ํ๊ฒ ํด๋์ค์ ๋ํด์๋ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ค ์ ์๊ณ , ์ด ๊ณผ์ ์์ Enhancer๋ผ๋ ํด๋์ค๋ฅผ ํ์ฉํจ
CGLIB๋ ํ๊ฒ ํด๋์ค์ ์์์ ๋ฐ๊ณ ํ๋ก์๋ฅผ ์์ฑ, ์ด๋ ํ๊ฒ ํด๋์ค์ ํฌํจ๋ ๋ชจ๋ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๊ณ , ํ๊ฒ ํด๋์ค์ ๋ํ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์กฐ์ํ์ฌ ํ๋ก์๋ฅผ ์์ฑํจ
CGLIB ํ๋ก์๋ฅผ ๊ฐ์ ๋ก ์ฌ์ฉํ๋ ค๋ฉด ์์์ proxy-target-class ์์ฑ ๊ฐ์ true๋ก ์ค์
<aop:config proxy-target-class="true"/>
https://steady-coding.tistory.com/608
https://docs.spring.io/spring-framework/docs/3.0.0.M3/reference/html/ch08s06.html