2023. 7. 15. 13:55ใ๊ฐ๋ ์ ๋ฆฌ ์์ ์ค/Java
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."
๐ ์คํ๋ง AOP ๊ฐ๋ ์ ๋ฆฌ
๐ฝ ์ด๋ก
๐ฆ AOP๋?
AOP๋ Aspect Oriented Programming์ ์ฝ์๋ก ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด๋ผ๊ณ ๋ถ๋ฅด๊ณ ์์ด์.
์ด๊ฒ์ ์ด๋ค ๋ก์ง ๊ธฐ์ค ํต์ฌ์ ์ธ ๊ด์ ๊ณผ ๋ถ๊ฐ์ ์ธ ๊ด์ ์ ๋๋๊ณ , ๊ฐ๊ฐ์ ๊ด์ ์ ๋ฐ๋ผ ๋ชจ๋ํํ์ฌ ๊ฐ๋ฐํ๋ ๋ฐฉ์์ ์ด์ผ๊ธฐํด์.
์๋ฅผ ๋ค์๋ฉด ํต์ฌ์ ์ธ ๊ด์ ์ด๋ ์ฐ๋ฆฌ๊ฐ ์ ์ฉํ๊ณ ์ ํ๋ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์ด์ผ๊ธฐํ ์ ์์ด์.
๋ถ๊ฐ์ ์ธ ๊ด์ ์ ํต์ฌ ๋ก์ง์ ์คํํ๊ธฐ ์ํด ํํด์ง๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ, ๋ก๊น
, ํ์ผ ์
/์ถ๋ ฅ ๋ฑ์ด ๋ ์ ์์ด์.
์ฆ, AOP์์ ๊ฐ ๊ด์ ์ ๊ธฐ์ค์ผ๋ก ๋ก์ง์ ๋ชจ๋ํ ํ๋ค๋ ๊ฒ์ ์ฝ๋๋ค์ ๋ถ๋ถ์ ์ผ๋ก ๋๋์ด ๋ชจ๋ํ ํ๊ฒ ๋ค๋ ์๋ฏธ์์.
์ด ๋, ์์ค ์ฝ๋ ์์์ ๋ค๋ฅธ ๋ถ๋ถ์ ๊ณ์ ๋ฐ๋ณตํด์ ์ฐ๋ ์ฝ๋๋ค์ด ์์ ์ ์๋๋ฐ, ์ด๊ฒ์ Crosscutting Concerns ์ฆ, ํฉ์ด์ง ๊ด์ฌ์ฌ๋ผ๊ณ ๋ถ๋ฅด๊ณ ์๋ต๋๋ค.
์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ํฉ์ด์ง ๊ด์ฌ์ฌ๋ฅผ Aspect๋ก ๋ชจ๋ํํ๊ณ , ํต์ฌ์ ์ธ ๋น์ฆ๋์ค ๋ก์ง์์ ๋ถ๋ฆฌํ์ฌ ์ฌ ์ฌ์ฉํ๊ฒ ๋ค๋ ๊ฒ์ด AOP์์.
AOP๋ ์ด๋ค ์ธ์ด๋ฅผ ์ด์ผ๊ธฐํ๋ ๊ฒ์ด ์๋๊ณ , ๊ธฐ์กด์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ(OOP) ์ธ์ด๋ฅผ ๋ณด์ ๋ฐ ํ์ฅํ๋ ํํ๋ก ์ฌ์ฉํ๊ณ ์์ด์.
์๋ฐ ์ง์์์ ์ฌ์ฉ๋๋ AOP ๋๊ตฌ ์ค ๋ํ์ ์ธ ๊ฒ์ผ๋ก AspectJ, JBossAOP, SpringAOP๊ฐ ์๋ต๋๋ค.
AOP๋ ๊ฒฐ๊ตญ ์ค๋ณต๋๋ ์ฝ๋ ์ ๊ฑฐ ๋ฐ ํจ์ธ์ ์ธ ์ ์ง๋ณด์, ๋์ ์์ฐ์ฑ, ์ฌํ์ฉ์ฑ ๊ทน๋ํ, ๋ณํ ์์ฉ๋ฑ์ ์ํด ์ฌ์ฉํ๋ ๊ฒ์ด์์.
AOP ๊ด๋ จ ์ฉ์ด ์ ๋ฆฌ
์ฉ ์ด | ์ ์ธ ๋ด ์ฉ |
JoinPoint | โ Method๋ฅผ ํธ์ถํ๋ '์์ ', ์์ธ๊ฐ ๋ฐ์ํ๋ '์์ '๊ณผ ๊ฐ์ด Application ์คํํ ๋, ํน์ ์์
์ด ์คํ๋๋ '์์ ' ์๋ฏธ โ Advice๊ฐ ์ ์ฉ๋ ์์น, ๋ผ์ด๋ค ์ ์๋ ์ง์ . Method ์ง์ ์ง์ , ์์ฑ์ ํธ์ถ ์์ , Field์์ ๊ฐ์ ๊บผ๋ด ์ฌ ๋ ๋ฑ ๋ค์ํ ์์ ์ ์ ์ฉ |
Advice | โ JoinPoint์์ ์คํ๋์ด์ผ ํ๋ ์ฝ๋ โ ๋ถ๊ฐ์ ๊ด์ ์ ํด๋น (ํธ๋์ญ์ , ๋ก๊ทธ, ๋ณด์, ์ธ์ฆ ๋ฑ..) โ ์ค์ ์ด๋ค ์ผ์ ํด์ผํ ์ง์ ๋ํ ๋ด์ฉ |
Target | โ ์ค์ง์ ์ธ ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌํํ๊ณ ์๋ ์ฝ๋ โ ํต์ฌ๊ด์ ์ ํด๋น โ Aspect๋ฅผ ์ ์ฉํ๋ ๊ณณ (Class ํน์ Method) |
PointCut | โ Target Class์ Advice๊ฐ ๊ฒฐํฉ(Weaving)๋ ๋, ๋ ์ฌ์ด์ ๊ฒฐํฉ ๊ท์น ์ ์ - Advice๊ฐ ์คํ๋ Target ํน์ Method ์ง์ โ JoinPoint์ ์์ธ ์คํ ์ ์ ํ ๊ฒ์ผ๋ก A๋ Method์ ์ง์ ์์ ์ ํธ์ถํ ๊ฒ๊ณผ ๊ฐ์ด ๋์ฑ ๊ตฌ์ฒด์ ์ผ๋ก Advice ์คํ ์ง์ ๋ช ์ |
Aspect | โ Advice์ PointCut์ ํฉ์ณ ํ๋์ Aspect๋ผ๊ณ ์ง์นญ - ์ผ์ ํจํด์ ๊ฐ์ง๋ Class์ Advice๋ฅผ ์ ์ฉํ๋๋ก ์ง์ํ ์ ์๋ ๊ฒ์ Aspect๋ผ๊ณ ์ง์ง โ ํฉ์ด์ง ๊ด์ฌ์ฌ๋ฅผ ๋ชจ๋ํ ํ ๊ฒ์ผ๋ก ์ฃผ๋ก ๋ถ๊ฐ ๊ธฐ๋ฅ ๋ชจ๋ํ |
Weaving | โ AOP์์ JoinPoint๋ค์ Advice๋ก ๊ฐ์ธ๋ ๊ณผ์ ์ง์นญ โ Weaving ํ๋ ์์ ์ ๋์์ฃผ๋ ๊ฒ์ด AOP ํด์ด ํ๋ ์ญํ |
AOP ์ ์ฉ ๋ฐฉ๋ฒ
์ ๋ชฉ | ์ ์ธ ๋ด ์ฉ |
์ปดํ์ผ ํ์ ์ ์ฉ | ์ปดํ์ผ ์์ ์ Byte Code๋ฅผ ์กฐ์ํ์ฌ AOP๊ฐ ์ ์ฉ๋ Byte Code ์์ฑ |
๋ก๊ทธ ํ์ ์ ์ฉ | ์์ํ๊ฒ ์ปดํ์ผ ํ ๋ค, ํด๋์ค ๋ก๋ฉ ์์ ์ ํด๋์ค ์ ๋ณด ๋ณ๊ฒฝ |
๋ฐํ์ ์ ์ฉ | ์คํ๋ง AOP๊ฐ ์ฃผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก A๋ผ๋ Class Type์ Bean์ ๋ง๋ค ๋, A Type์ Proxy Bean์ ๋ง๋ค์ด Proxy Bean์ด Aspect Code ์ถ๊ฐํ์ฌ ๋์ํ๋๋ก ํ๋ ๋ฐฉ๋ฒ |
Spring AOP
โ Spring์์ ์ ๊ณตํ๋ Spring AOP๋ Proxy ๊ธฐ๋ฐ AOP ๊ตฌํ์ฒด
โ Proxy ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ๊ทผ ์ ์ด ๋ฐ ๋ถ๊ฐ ๊ธฐ๋ฅ ์ถ๊ฐ๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ
โ Spring AOP๋ Spring Bean์๋ง ์ ์ฉ ๊ฐ๋ฅ
โ ๋ชจ๋ AOP ๊ธฐ๋ฅ ์ ๊ณต ๋ชฉ์ ์ด ์๋ ์ค๋ณต ์ฝ๋, Proxy Class ์์ฑ์ ๋ฒ๊ฑฐ๋ก์ ๋ฑ ํํ ๋ฌธ์ ํด๊ฒฐ ์ํ ์๋ฃจ์
์ ๊ณต ๋ชฉ์
โ Spring AOP๋ ์์ JAVA๋ก ๊ตฌํ๋์๊ธฐ ๋๋ฌธ์ ํน๋ณํ ์ปดํ์ผ ๊ณผ์ ๋ถ ํ์
Proxy Pattern์๋ Interface ์กด์ฌํ๊ณ , Client๋ ์ด Interface Type์ผ๋ก Proxy ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ฒ ๋์.
Proxy ๊ฐ์ฒด๋ ๊ธฐ์กด Target Object (Real Subject)๋ฅผ ์ฐธ์กฐํ๋ต๋๋ค.
Proxy ๊ฐ์ฒด์ ๊ธฐ์กด ํ๊ฒ ๊ฐ์ฒด์ Type์ ๊ฐ๊ณ , Proxy๋ ์๋ ํ ์ผ์ ๊ฐ์ง๊ณ ์๋ Real Subject๋ฅผ ๊ฐ์ธ Client์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด์์.
Annotaion
์ข ๋ฅ | ์ ์ธ ๋ด ์ฉ |
@Around | Target Method๋ฅผ ๊ฐ์ธ ํน์ Advice ์คํํ๊ธฐ ์ํด ์ฌ์ฉ |
@Before | Advice Tartget Method ํธ์ถ ๋๊ธฐ ์ Advice ๊ธฐ๋ฅ ์ํ์ ์ํด ์ฌ์ฉ |
@After | Target Method ๊ฒฐ๊ณผ์ ๊ด๊ณ์์ด |
@AfterReturning | Target Method๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๊ฒฐ๊ณผ๊ฐ ๋ฐํ ๋ค Advice ๊ธฐ๋ฅ ์ํ์ ์ํด ์ฌ์ฉ |
@AfterThrowing | Target Method๊ฐ ์์ธ ๋ฐ์ ์ Advice ๊ธฐ๋ฅ ์ํ์ ์ํด ์ฌ์ฉ |
@Around | Advice Target Method๋ฅผ ๊ฐ์ธ Target Method ํธ์ถ ์ ๊ณผ ํ์ Adivce ๊ธฐ๋ฅ ์ํ์ ์ํด ์ฌ์ฉ |
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."