2021. 11. 15. 11:39ใSpring
1. Spring AOP
1๏ธโฃ ํต์ฌ๊ธฐ๋ฅ๊ณผ ๋ถ๊ฐ๊ธฐ๋ฅ
ํต์ฌ ๊ธฐ๋ฅ์ ์ ๋ฌด ๋ก์ง์ ํฌํจํ๋ ๊ธฐ๋ฅ์ด๊ณ ,
๋ถ๊ฐ ๊ฐ๋ฅ์ ํต์ฌ ๊ธฐ๋ฅ์ ๋์์ฃผ๋ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ(๋ก๊น , ๋ณด์ ๋ฑ)์ ๋ถ๊ฐ๊ธฐ๋ฅ(cross-cutting Concerns)์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
2๏ธโฃ AOP(Aspect Oriented Programming)
AOP๋ ์ ํ๋ฆฌ์ผ์ด์ ์์์ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ, ์ฆ ํต์ฌ์ ์ธ ๊ธฐ๋ฅ์์ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํ๋ค.
๋ฐ๋ผ์ AOP์ ๋ชฉ์ ์ ํ๋ก๊ทธ๋๋จธ๋ค์ ์ผ๋ ์ฌํญ์ ๋ณ๋์ ๊ด์ฌ์ฌ(Aspect)๋ก ๋ถ๋ฆฌํ์ฌ ์ฝ๋ ๊ฐ๋ฐํ ๋ ํต์ฌ ๊ธฐ๋ฅ์ ๋ ์ง์คํ ์ ์๋๋ก ํด์ฃผ๋ ๊ฒ์ด๋ค! => Separation of Cross-Cutting Concern
2. Spring AOP ์ฉ์ด
1๏ธโฃ Aspect
: Aspect๋ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ์ ์ํ ์ฝ๋์ธ Advice์ ์ด Advice๋ฅผ ์ด๋์ ์ ์ฉํ ์ง๋ฅผ ๊ฒฐ์ ํ๋ PintCut์ ํฉ์น ๊ฐ๋ ์ด๋ค.
Aspect = Advice + PointCut
-> AOP ๊ฐ๋ ์ ์ ์ฉํ๋ฉด ํต์ฌ๊ธฐ๋ฅ ์ฝ๋ ์ฌ์ด์ ์นจํฌํ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ๋ ๋ฆฝ์ ์ธ Aspect๋ก ๊ตฌ๋ถํ ์ ์๋ค.
๊ตฌ๋ถ๋ ๋ถ๊ฐ๊ธฐ๋ฅ Aspect๋ฅผ ๋ฐํ์ ์์ ํ์ํ ์์น์ ๋์ ์ผ๋ก ์ฐธ์ฌํ๊ฒ ํ ์ ์๋ค.
2๏ธโฃ Target
: ํต์ฌ ๊ธฐ๋ฅ์ ๋ด๊ณ ์๋ ๋ชจ๋๋ก, ํ๊ฒ์ ๋ถ๊ฐ๊ธฐ๋ฅ์ ๋ถ์ฌํ ๋์์ด ๋๋ค.
3๏ธโฃ Advice
: Advice๋ ํ๊ฒ์ ์ ๊ณตํ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ๋ด๊ณ ์๋ ๋ชจ๋์ด๋ค.
4๏ธโฃ JoinPoint
: Advice๊ฐ ์ ์ฉ๋ ์ ์๋ ์์น๋ฅผ ๋งํ๋ค. (Target ๊ฐ์ฒด๊ฐ ๊ฐ์ง ๋ฉ์๋)
ํ๊ฒ ๊ฐ์ฒด๊ฐ ๊ตฌํํ ์ธํฐํ์ด์ค์ ๋ชจ๋ ๋ฉ์๋๋ ์กฐ์ธ ํฌ์ธํธ๊ฐ ๋๋ค.
Proxy๊ฐ Advice๋ฅผ Target์ Weavingํด์ฃผ๋ ๋์์ ๋ฐ๋ก Target์ JoinPoint ๋ฉ์๋์ด๋ค!
๋ฐ๋ผ์ Joinpoint๋ฅผ ํธ์ถํ๋ฉด Spring AOP๊ฐ Proxy๊ฐ ๊ฐ๋๋์ด Proxy๊ฐ Advice์ Target์ JoinPoint๋ฅผ ํธ์ถํ๋ค.
5๏ธโฃ PointCut
: Advice๋ฅผ ์ ์ฉํ ํ๊ฒ์ ๋ฉ์๋๋ฅผ ์ ๋ณํ๋ ์ ๊ท ํํ์์ด๋ค.
ํฌ์ธํธ์ปท ํํ์์ execution์ผ๋ก ์์ํ๊ณ , ๋ฉ์๋์ signature๋ฅผ ๋น๊ตํ๋ ๋ฐฉ๋ฒ์ ์ฃผ๋ก ์ด์ฉํ๋ค.
6๏ธโฃ Aspect
: Aspect๋ AOP์ ๊ธฐ๋ณธ ๋ชจ๋๋ก Advice + PointCut์ด๊ณ , Aspect๋ ์ฑ๊ธํค ํํ์ ๊ฐ์ฒด๋ก ์กด์ฌํ๋ค.
7๏ธโฃ Advisor
: Advisor = Aspect + PointCut
Advisor๋ Spring AOP์์๋ง ์ฌ์ฉ๋๋ ํน๋ณํ ์ฉ์ด์ด๋ค.
8๏ธโฃ Weaving โญ
: Weaving์ PointCut์ ์ํด์ ๊ฒฐ์ ๋ ํ๊ฒ์ joinpoint์ Advise๋ฅผ ์ฝ์ ํ๋ ๊ณผ์ ์ ์๋ฏธํ๋ค.
Weaving์ AOP๊ฐ ํต์ฌ๊ธฐ๋ฅ(Target)์ ์ฝ๋์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉด์ ํ์ํ ๋ถ๊ฐ๊ธฐ๋ฅ(Advise)์ ์ถ๊ฐํ ์ ์๋๋ก ํด์ฃผ๋ ํต์ฌ์ ์ธ ์ฒ๋ฆฌ๊ณผ์ ์ด๋ค.
9๏ธโฃ Proxy
: Proxy๋ Target์ ๊ฐ์ธ๊ณ ์๊ณ , Target ํธ์ถ์ฝ๋๊ฐ ์ํ๋ ๋๋ฉด Target์ ํธ์ถํ๊ธฐ ์ , ํ ํน์ ์ค๊ฐ์ Advice๋ฅผ Weaving ํ์ฌ ์คํํ๋ค.
3. Spring AOP์ ํน์ง
1๏ธโฃ Spring์ Proxy ๊ธฐ๋ฐ AOP๋ฅผ ์ง์ํ๋ค.
: Spring์ Target ๊ฐ์ฒด์ ๋ํ Proxy๋ฅผ ๋ง๋ค์ด ์ ๊ณตํ๋ค.
Target์ ๊ฐ์ธ๋ Proxy๋ Runtime ์ ์์ฑ๋๊ณ , Proxy๋ Advice๋ฅผ Target๊ฐ์ฒด์ ์ ์ฉํ๋ฉด์ ์์ฑ๋๋ ๊ฐ์ฒด์ด๋ค.
2๏ธโฃ Proxy๊ฐ ํธ์ถ์ ๊ฐ๋ก์ฑ๋ค. (Intercept)
: Proxy๋ Target ๊ฐ์ฒด์ ๋ํ ํธ์ถ์ ๊ฐ๋ก์ฑ ๋ค์์ Advice์ ๋ถ๊ฐ๊ธฐ๋ฅ ๋ก์ง์ ์ํํ๊ณ ๋ ํ์ Target์ ํต์ฌ๊ธฐ๋ฅ ๋ก์ง์ ํธ์ถํ๋ ์ ์ฒ๋ฆฌ ์ด๋๋ฐ์ด์ค์ Target์ ํต์ฌ๊ธฐ๋ฅ ๋ก์ง ๋ฉ์๋๋ฅผ ํธ์ถํ ํ์ Advice์ ์ํํ๋ ๊ฒฝ์ฐ์ธ ํ์ฒ๋ฆฌ ์ด๋๋ฐ์ด์ค๊ฐ ์๋ค.
3๏ธโฃ Spring AOP๋ ๋ฉ์๋ JoinPoint์์๋ง ์ง์ํ๋ค.
: Spring์ ๋์ Proxy๋ฅผ ๊ธฐ๋ฐ์ผ๋ก AOP๋ฅผ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ๋ฉ์๋ joinpoint๋ง ์ง์ํ๋ค.
=> Target์ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ ๋ฐํ์ ์์ ์๋ง Advice๋ฅผ ์ ์ฉํ ์ ์๋ค.
โ AspectJ์ ๊ฐ์ ๊ณ ๊ธ aop๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์ํ ์์ ์ ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ ์ฉํ ์ ์๊ธดํ๋ค. (๊ฐ์ฒด ์์ฑ, ํ๋๊ฐ ์กฐํ์ ์กฐ์, static ๋ฉ์๋ ํธ์ถ ๋ฐ ์ด๊ธฐํ)
4๏ธโฃ Spring AOP ๊ตฌํ ๋ฐฉ์
- XML ๊ธฐ๋ฐ์ POJO ํด๋์ค๋ฅผ ์ด์ฉํ AOP ๊ตฌํ <aop:config>
- @Aspect ์ด๋ ธํ ์ด์ ์ ์ด์ฉํ AOP ๊ตฌํ <aop:aspectj-autoproxy/>
4. AspectJ์ Spring AOP ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
1๏ธโฃ AspectJ Runtime ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
https://mvnrepository.com/artifact/org.aspectj/aspectjrt
2๏ธโฃ Aspect Weaver ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
https://mvnrepository.com/artifact/org.aspectj/aspectjweaver
3๏ธโฃ Spring AOP ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
https://mvnrepository.com/artifact/org.springframework/spring-aop