๊นํ๋ธ์๋ ์ ๋ฆฌ ์ฌ๋ ค๋์์ต๋๋ค.
์ ์๋ฏผ_๊นํ๋ธ ์ฃผ์
Weaving๊ณผ Proxy ๊ฐ์ฒด์ ๋ํ์ฌ
์ด๋ฒ ์ฅ์์ ์์๋ณผ ๊ฒ:
AOP์์ Weaving์ด๋ ๋ฌด์์ธ๊ฐ? Proxy์์ ๊ด๊ณ๋ ์ด๋ป๊ฒ ๋๋๊ฐ?
- Proxy ๊ฐ์ฒด๋ ๋ฌด์์ด๊ณ ? AOP์์ ์ฌ์ฉ๋๋ ์๋ฆฌ๋ ๋ฌด์์ธ๊ฐ?
1. AOP์์ Weaving์ด๋ ๋ฌด์์ธ๊ฐ?
AOP์์ weaving์ด๋ ๋ถ๊ฐ๊ธฐ๋ฅ(advice)์ ๊ทธ๊ฒ์ด ํ๊ฒํ
ํ๋ ๋ณธ ๊ธฐ๋ฅ์ ์ฅ์ฐฉํ๋ ์์
์ ๋งํ๋ค. ๋ฐ๋ผ์ weaving์ ๋ณธ๊ธฐ๋ฅ์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉด์ ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ฐ๊ฒฐ์ํค๋ AOP์ ํต์ฌ ์์
์ด๋ค.
weaving์ ์คํ๋๋ ์์ ์ ๋ฐ๋ผ 3๊ฐ์ง๋ก ์ข
๋ฅ๊ฐ ๋๋๋ค.
(1) Compile Time Weaving(CTW)
Spring์์ AOP๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์๋ AspectJ๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ๋ ๊ฒ๊ณผ, Spring AOP API๋ฅผ ์ด์ฉํ๋ ๊ฒ์ผ๋ก ํฌ๊ฒ ๋ ๊ฐ์ง๊ฐ ๋๋๋ค. ์ด ์ค์์ Compile TIme weaving์ AspectJ๋ก AOP๋ฅผ ๊ตฌํํ ๋ ์ฌ์ฉํ ์ ์๋ Weaving ๋ฐฉ๋ฒ์ด๋ค.
AspectJ์๊ฒ๋ AJC(AspectJ Compiler)๋ผ๋ ์๋ฐ ์ปดํ์ผ๋ฌ๋ฅผ ํ์ฅํ ์์ ๋ง์ ์ปดํ์ผ๋ฌ๊ฐ ์๋๋ฐ, ์ด ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๋ฉด, ํ๋ก๊ทธ๋จ ์ปดํ์ผ ๋จ๊ณ์์ ์ปดํ์ผ๋ฌ๊ฐ ๊ธฐ๊ณ์ด ์ ๋จ๊ณ์ธ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์กฐ์ํด์ ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ง์ ๋ณธ๊ธฐ๋ฅ์ ๋ถ์ฐฉ ์ํจ๋ค. CTW๋ ์ปดํ์ผ ๋จ๊ณ์์ AOP๋ฅผ ์ํํ๋ฏ๋ก 3๊ฐ์ง ๋ฐฉ๋ฒ ์ค ์ ์ผ ์๋๊ฐ ๋น ๋ฅด๋ค๋ ์ฅ์ ์ด ์๋ค. ํ์ง๋ง, ๋ง์ฝ ๊ฐ๋ฐ์๊ฐ Lombok์ฒ๋ผ ์ปดํ์ผ ๋จ๊ณ์์ ์ฝ๋๋ฅผ ์กฐ์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํด๋น AJC๋ ๊ฐ์ด ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฐ์ดํธ ์ฝ๋ ์กฐ์ ๋จ๊ณ์์ ์ถฉ๋ ์๋ฌ๊ฐ ์ผ์ด๋ ๊ฐ๋ฅ์ฑ์ด ๋๋ค. (๊ฑฐ์ ๋ฌด์กฐ๊ฑด ์ผ์ด๋์ Lombok๊ณผ AspectJ๋ ๊ฐ์ด ์ฌ์ฉ ๋ถ๊ฐ!)
(2) Runtime Weaving(RTW)
ํด๋น ๋ฐฉ์์ Spring AOP API๋ฅผ ์ฌ์ฉํด์ AOP๋ฅผ ๊ตฌํํ ๋ ์ฌ์ฉํ๋ weaving ๋ฐฉ์์ด๋ค. ์ฌ๊ธฐ์ Proxy๋ผ๋ ๊ฐ์ฒด๊ฐ ์ฐ์ธ๋ค. RTW๋ Proxy ๊ฐ์ฒด๋ฅผ ์ด์ฉํ์ฌ ๋ณธ ๊ธฐ๋ฅ์ ์ด๋ ํ ์ํฅ๋ ์ฃผ์ง ์๊ณ AOP๋ฅผ ๊ตฌํํ๋ค. (RTW๊ฐ ์ด๋ป๊ฒ Proxy ๊ฐ์ฒด๋ฅผ ์ด์ฉํ์ฌ AOP๋ฅผ ์์ฑํ๋์ง๋ ํ์ ํ๊ฒ ๋ค.) ํด๋น ๊ธฐ๋ฅ์ ๋ฐ์ดํธ ์ฝ๋ ์กฐ์๊ณผ ๊ฐ์ ๊ณผ์ ์ด ์๊ธฐ ๋๋ฌธ์, ํด๋์ค ํ์ผ์ด๋ ์ฝ๋ ํ์ผ์ด ์จ์ ํ๊ฒ ์ปดํ์ผ ๋๋ค๋ ์ฅ์ ์ด ์์ง๋ง, ๋ง์ฝ pointcut ๋น ์ฐ๊ฒฐ์ง์ด์ผ ํ๋ advice ์๊ฐ ๋ง์ ๊ฒฝ์ฐ, ์๋๊ฐ ๋ค๋ฅธ ๋ฐฉ์๋ค์ ๋นํด ์๋์ ์ผ๋ก ๋ ๋๋ ค์ง๋ค๋ ๋จ์ ์ด ์๋ค.
(3) Load Time Weaving (LTW)
ClassLoader๋ฅผ ์ด์ฉํด ํด๋์ค๊ฐ JVM์ ๋ก๋๋ ๋, ๋ฐ์ดํธ ์กฐ์์ ํตํด ๋ณธ๊ธฐ๋ฅ์ advice๋ฅผ ์ฝ์ ํ๋ (์๋นํ๋) ๋ฐฉ์์ด๋ค.
2. Proxy์ weaving์ ๊ด๊ณ๋ ์ด๋ป๊ฒ ๋๋๊ฐ?
Proxy๋ Runtime weaving์ ๊ตฌํํ ๊ฒฝ์ฐ, ๊ตฌํ์ ํต์ฌ์ด ๋๋ ๊ฐ๋ ์ด๋ค. ์ ์ด์ Proxy๊ฐ ๋ฌด์์ด๊ณ , RTW์ ์๋ฆฌ๋ ๋ฌด์์ธ์ง ํ๋ฒ ์ดํด๋ณด์.
3. Proxy๋? + RTW์ ์๋ฆฌ
proxy์ ์ฌ์ ์ ์๋ฏธ๋ ๋๋ฆฌ์ธ ์ด๋ค. Spring AOP์์ proxy ๋ผ๋ ๊ฐ๋
๋ํ ์ด ์ฌ์ ์ ์๋ฏธ๋ฅผ ๊ทธ๋๋ก ๋ฐ๋ผ๊ฐ๋๋ฐ, ์ ๊ฐ์ฒด(real Object)๋ฅผ ๋์ ํ์ฌ ์ผ์ ์ฒ๋ฆฌํ๋ ๊ฐ์ฒด๋ผ๋ ์๋ฏธ์ด๋ค.
๋ง์ฝ Service ๊ฐ์ฒด A์ Proxy๋ฅผ Z๋ผ๊ณ ๊ฐ์ ํด๋ณด์. ๋ง์ฝ ํด๋ผ์ด์ธํธ๊ฐ ์๋น์ค ๋ก์ง A์๊ฒ ์์ฒญ์ ๋ณด๋ธ ๊ฒฝ์ฐ, ๊ทธ๊ฒ์ ๋๋ฆฌ์ธ Z๊ฐ ์์ ์ด A์ธ์ฒ ํด๋ผ์ด์ธํธ๋ฅผ ์์ฌ์ ์์ฒญ์ ๋์ ๋ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์ฒ๋ฆฌ ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ํํ๊ณ ๋ณธ ๊ฐ์ฒด๋ฅผ ์์ ์ ๋ด๋ถ์์ ํธ์ถํ์ฌ ๋ณธ ๊ธฐ๋ฅ์ ์ํํ๋ค. ๊ทธ ํ ํ์ฒ๋ฆฌ ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ํํ๋ค.
์์ ๊ทธ๋ฆผ์ผ๋ก ์ค๋ช ํ์ง๋ง, Proxy ๊ฐ์ฒด๋ฅผ ์ด์ฉํ RTW๋ฅผ ๊ธ๋ก ์ค๋ช ํด๋ณด์๋ฉด
- ์ฌ์ ์์ : proxy๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ๊ทธ ์์ ์ ์ฒ๋ฆฌ ๋ถ๊ฐ๊ธฐ๋ฅ ์ํ -> ๋ณธ๊ธฐ๋ฅ ํธ์ถ๊ณผ ๋ฐํ -> ํ์ฒ๋ฆฌ ๋ถ๊ฐ๊ธฐ๋ฅ ์ํ ์ผ๋ก ๊ตฌ์ฑํ๋ค. (ํด๋น ๊ตฌ์ฑ์ Spring AOP ์ด๋ ธํ ์ด์ ์ฌ์ฉํ๋ฉด ์คํ๋ง์ด ์๋์ผ๋ก ํด์ค)
- ์ฌ์ฉ์๊ฐ ์์ฒญํ๋ฉด ๋ณธ ๊ฐ์ฒด(real Object) ๋์ ์ ๊ทธ์ ๋์๋๋ Proxy๊ฐ์ฒด๊ฐ ๋์ ํธ์ถ๋๋ค.
- Before Advice๊ฐ ์์ ์ ๊ทธ๊ฒ์ด ์ํ๋๋ค.
- Proxy๊ฐ ๋ณธ ๊ฐ์ฒด์ ํ์ํ ๊ธฐ๋ฅ์ ํธ์ถํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ ๋ฐ๋๋ค.
- After Advice๊ฐ ์์ ์ ๊ทธ๊ฒ์ด ์ํ๋๋ค.
- ๋ชจ๋ ์ฒ๋ฆฌ๊ฐ ๋๋๋ฉด ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํ๋ค.