1. ํต์ฌ ๊ด์ฌ์ฌ (Core Concerns)
( ํต์ฌ ๊ธฐ๋ฅ )
Ex. ์ ๋ฌด ๋ก์ง
2. ํก๋จ ๊ด์ฌ์ฌ (CROSS-CUTTING CONCERNS)
ํต์ฌ ๊ธฐ๋ฅ์ ๋ณด์กฐํ๊ธฐ ์ํด ์ฌ๋ฌ ํด๋์ค์ ๊ฑธ์ณ ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ
โ ์ค๋ณต ์ฝ๋ ์๊น ( AOP ๋ฐฉ์์ผ๋ก ํด๊ฒฐ )
ํต์ฌ๊ธฐ๋ฅ๊ณผ ํจ๊ป ์ฌ์ฉ ( ๋จ๋ X )
Ex. ๋ก๊น
, ๋ณด์, ํธ๋์ญ์
, ๋ก๊ทธ ์ถ์ ๋ก์ง ๋ฑ
Ex. orderService๋ผ๋ ํ๋์ ๊ฐ์ฒด์ ํต์ฌ๊ธฐ๋ฅ์ธ ์ฃผ๋ฌธ ๋ก์ง๊ณผ ๋ถ๊ฐ๊ธฐ๋ฅ์ธ ๋ก๊ทธ ์ถ์ ๋ก์ง์ด ํฉ์ณ์ ธ์ ํ๋์ ๋ก์ง์ ์์ฑํ๊ฒ ๋จ
OOP์ ํต์ฌ์ ๊ณตํต๋ ๋ชฉ์ ์ ๋ ๋ฐ์ดํฐ์ ๋์์ ๋ฌถ์ด ํ๋์ ๊ฐ์ฒด๋ก ์ ์ํ๋ ๊ฒ
๊ธฐ๋ฅ์ ์ฌ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด ํฐ ์ฅ์
๊ด์ฌ์ฌ ๋ถ๋ฆฌ (Separation of Concerns, SoC)์ ๋์์ธ ์์น์ ์ค์ํด์ผํจ
OOP ๋ชจ๋ํ์ ํต์ฌ ๋จ์ โ ํด๋์ค
๋น์ฆ๋์ค ํด๋์ค์ ํก๋จ ๊ด์ฌ์ฌ์ ํต์ฌ ๊ด์ฌ์ฌ๊ฐ ๊ณต์กดํ๊ฒ ๋๋๋ฐ,
์ด ๋ ๋ฉ์๋ ๋ณต์ก๋๊ฐ ์ฆ๊ฐํ์ฌ ๋น์ฆ๋์ค ์ฝ๋ ํ์
์ด ์ด๋ ต๊ณ ,
๋ถ๊ฐ ๊ธฐ๋ฅ์ ๋ถํน์ ๋ค์ ๋ฉ์๋๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ๊ตฌํ๋์ด ํก๋จ ๊ด์ฌ์ฌ์ ๋ชจ๋ํ๊ฐ ์ด๋ ค์
โ OOP์ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ์ ๋ํ ํ๊ณ๋ฅผ ํด๊ฒฐํ๊ณ ์ AOP ๋ฑ์ฅ
๊ธฐ์กด๊ณผ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ ๊ตฌ์กฐ ์ฌ๊ณ ๋ฐฉ์์ ์ ๊ณตํจ์ผ๋ก์จ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ(OOP)์ ๋ถ์กฑํ ๋ถ๋ถ์ ๋ณด์ํ๋ ๊ฒ
์ฌ๋ฌ ์ ํ๊ณผ ๊ฐ์ฒด ๊ฐ์ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๋ชจ๋ํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํจ
AOP์ ๋ชจ๋ํ์ ํต์ฌ ๋จ์ โ ๊ด์ (Aspect)
( OOP์ ๋ชจ๋ํ์ ํต์ฌ ๋จ์ โ ํด๋์ค (class) )
โ๏ธ Aspect
- ์ฌ๋ฌ ๊ฐ์ฒด์ ๊ณตํต์ผ๋ก ์ ์ฉ๋๋ ๊ธฐ๋ฅ ( ๊ณตํต ๊ธฐ๋ฅ = ํก๋จ ๊ด์ฌ์ฌ )
- Aspect = ์ด๋๋ฐ์ด์ค(Advice) + ํฌ์ธํธ์ปท(PointCut)
( ๋ถ๊ฐ ๊ธฐ๋ฅ์ ์ ์ํ ์ฝ๋์ธ ์ด๋๋ฐ์ด์ค(Advice)์ ์ด๋๋ฐ์ด์ค๋ฅผ ์ด๋์ ์ ์ฉํ ์ง ๊ฒฐ์ ํ๋ ํฌ์ธํธ์ปท(PointCut)์ ํฉ์น ๊ฐ๋ )
1. XML ๊ธฐ๋ฐ์ POJO ํด๋์ค๋ฅผ ์ด์ฉํ AOP ๊ตฌํ
๋ถ๊ฐ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ Advice ํด๋์ค๋ฅผ ์์ฑ
XML ์ค์ ํ์ผ์ <aop:config>๋ฅผ ์ด์ฉํด์ ์ ์คํํธ๋ฅผ ์ค์
(์ฆ, ์ด๋๋ฐ์ด์ค์ ํฌ์ธํธ์ปท์ ์ค์ ํจ)
2. @Aspect ์ ๋ํ ์ด์ ์ ์ด์ฉํ AOP ๊ตฌํ
@Aspect ์ ๋ํ ์ด์ ์ ์ด์ฉํด์ ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ Aspect ํด๋์ค๋ฅผ ์์ฑ
์ด ๋, Aspect ํด๋์ค๋ ์ด๋๋ฐ์ด์ค๋ฅผ ๊ตฌํํ๋ ๋ฉ์๋์ ํฌ์ธํธ์ปท์ ํฌํจ
XML ์ค์ ํ์ผ์ <aop:aspectj-autoproxy />๋ฅผ ์ค์
์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ ํ๋ฆ์์์ AOP๋ฅผ ์ ์ฉํ ์ ์๋ ๋ชจ๋ ํน์ ์ง์
์คํ๋ง ์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌํ ์ ์๋ ์คํ๋ง ๋น์๋ง AOP ์ ์ฉ ๊ฐ๋ฅ
ํญ์ ๋ฉ์๋ ๋ ๋ฒจ์๋ง AOP ์ ์ฉ ๊ฐ๋ฅ
( ์คํ๋ง AOP๊ฐ ํ๋ก์ ๋ฐฉ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ )
( ํ๋ก์ ๋ฐฉ์ = ๋ฐํ์ ์ค์ผ ๋, ์คํ๋ง ์ปจํ
์ด๋๊ฐ ๋น์ ์์ฑํ๋ฉด์, ์์ฒญ์ ํ๋ก์ ๊ฐ์ฒด๊ฐ ๋์ ๊ฐ๋ก์ฑ์ ์ฐ ๊ฐ์ฒด์ ๋ฃ์ด์ฃผ๋ ๊ฒ )
์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ก์ด ๋์์ ์ถ๊ฐํ๊ธฐ ์ํด, ์ด ์กฐ์ธ ํฌ์ธํธ์ ๊ด์ฌ์ฝ๋(Aspect Code) ์ถ๊ฐํจ
ํก๋จ ๊ด์ฌ์ฌ๋ ์กฐ์ธํฌ์ธํธ ์ /ํ์ AOP์ ์ํด ์๋์ผ๋ก ์ถ๊ฐ๋จ
์ด๋๋ฐ์ด์ค ์ ์ฉ์ด ํ์ํ ๊ณณ์ ์ ํ๋ฆฌ์ผ์ด์ ๋ด์ ๋ฉ์๋๋ฅผ ๊ฐ์ง
JointPoint ๋ฉ์๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋๋ฐ์ด์ค ๋ฉ์๋์ ๋งค๊ฐ๋ณ์๋ก ์ ์ธ๋ง ํ๋ฉด ๋จ
JoinPoint.getArgs()
โ JoinPoint์ ์ ๋ฌ๋ ์ธ์๋ฅผ ๋ฐฐ์ด๋ก ๋ฐํ
JoinPoint.getThis()
โ AOP ํ๋ก์ ๊ฐ์ฒด๋ฅผ ๋ฐํ
JoinPoint.getTarget()
โ AOP๊ฐ ์ ์ฉ๋ ๋์ ๊ฐ์ฒด๋ฅผ ๋ฐํ
( ํด๋ผ์ด์ธํธ๊ฐ ํธ์ถํ ๋น์ฆ๋์ค ๋ฉ์๋๋ฅผ ํฌํจํ๋ ๋น์ฆ๋์ค ๊ฐ์ฒด๋ฅผ ๋ฐํ )
JoinPoint.getSignature()
โ ์กฐ์ธ๋๋ ๋ฉ์๋์ ๋ํ ์ค๋ช
์ ๋ฐํ
( ํด๋ผ์ด์ธํธ๊ฐ ํธ์ถํ ๋ฉ์๋์ ์๊ทธ๋์ฒ(๋ฆฌํดํ์
, ์ด๋ฆ, ๋งค๊ฐ๋ณ์) ์ ๋ณด๊ฐ ์ ์ฅ๋ Signature ๊ฐ์ฒด๋ฅผ ๋ฐํ )
Signature
๊ฐ ์ ๊ณตํ๋ ๋ฉ์๋
( ๊ฐ์ฒด๊ฐ ์ ์ธํ๋ ๋ชจ๋ ์ฐ์ฐ์์, ์ฐ์ฐ์ ์ด๋ฆ, ๋งค๊ฐ๋ณ์๋ก ๋ฐ์๋ค์ด๋ ๊ฐ์ฒด๋ค์ ์๊ทธ๋์ฒ๋ผ๊ณ ํจ )
String getName()
โ ํด๋ผ์ด์ธํธ๊ฐ ํธ์ถํ ๋ฉ์๋ ์ด๋ฆ์ ๋ฐํ
String toLongString()
โ ํด๋ผ์ด์ธํธ๊ฐ ํธ์ถํ ๋ฉ์๋์ ๋ฆฌํดํ์
, ์ด๋ฆ, ๋งค๊ฐ๋ณ์๋ฅผ ํจํค์ง ๊ฒฝ๋ก๊น์ง ํฌํจํด์ ๋ฐํ
String toShortString()
โ ํด๋ผ์ด์ธํธ๊ฐ ํธ์ถํ ๋ฉ์๋ ์๊ทธ๋์ฒ๋ฅผ ์ถ์ฝํ ๋ฌธ์์ด๋ก ๋ฐํ
JoinPoint.toString()
โ ์กฐ์ธ๋๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ์ฉํ ์ค๋ช
์ ์ธ์
proceed()
ํน์ ์กฐ์ธํฌ์ธํธ(Join Point)์์ ์ํ๋ ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ ๋ฆฌํ ์ฝ๋
ํต์ฌ ์ฝ๋(Target)์ Aspect๋ฅผ ์ธ์ ์ ์ฉํ ์ง ์ ์
์์คํ ์ ์ฒด Aspect์ API ํธ์ถ ์ ๊ณต
๋ฉ์๋ ํธ์ถ ์ ์์ธ ์ ๋ณด ๋ฐ ๋ชจ๋ ๋ฉ์๋ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๊ธฐ ์ํด, ๋ก๊ฑฐ(Logger)๋ ์กฐ์ธํฌ์ธํธ(๋ฉ์๋ ์์ ์ ํฌ์ธํธ)๋ฅผ ์ ํ
โ๏ธ ๋ก๊ฑฐ (Logger)
์ผ๋ จ์ ๋ฐ์ดํฐ๋ฅผ ๋ก๊ทธ ํ์ผ๋ก ๊ธฐ๋กํ๋ ์ํํธ์จ์ด
์์๋ฅผ ๋ณด์ฅํ์ง ์์
์์๋ฅผ ์ง์ ํ๋ ค๋ฉด @Aspect
์ ์ฉ ๋จ์๋ก org.springframework.core.annotation.@Order
์ ๋ํ
์ด์
์ ์ ์ฉํด์ผํจ
์ด๋๋ฐ์ด์ค(Advice) ๋จ์๊ฐ ์๋ ํด๋์ค ๋จ์๋ก ์ ์ฉ ๊ฐ๋ฅ
ํ๋์ ์ ์คํฉํธ(Aspect)์ ์ฌ๋ฌ ์ด๋๋ฐ์ด์ค(Advice)๊ฐ ์กด์ฌํ๋ค๋ฉด ์์ ๋ณด์ฅ X
โ ์ ์คํฉํธ(Aspect)๋ฅผ ํด๋์ค๋ณ๋ก ๋ถ๋ฆฌํด์ผํจ
โ๏ธ Before
์กฐ์ธ ํฌ์ธํธ ์ด์ ์ ์คํ
ํ๊ฒ ๋ฉ์๋๊ฐ ์คํ๋๊ธฐ ์ ์ ์ฒ๋ฆฌํด์ผํ ํ์๊ฐ ์๋ ๋ถ๊ฐ๊ธฐ๋ฅ์ ํธ์ถ ์ ์ ๊ณตํต๊ธฐ๋ฅ ์คํ
Before Advice ๊ตฌํํ ๋ฉ์๋๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฆฌํดํ์
์ด void
( But, ๋ฆฌํด ๊ฐ์ ๊ฐ๋๋ผ๋ ์ค์ Advice ์ ์ฉ ๊ณผ์ ์๋ ์ํฅ X )
์์ ํ๋ฆ ๋ณ๊ฒฝ ๋ถ๊ฐ
๋ฉ์๋ ์ข
๋ฃ ์, ์๋์ผ๋ก ๋ค์ ํ๊ฒ ํธ์ถ
( ์ฃผ์์ : ๋ฉ์๋์์ ์์ธ๋ฅผ ๋ฐ์์ํฌ ๊ฒฝ์ฐ, ๋์ ๊ฐ์ฒด์ ๋ฉ์๋ ํธ์ถ ์๋จ )
โ๏ธ After returning
์กฐ์ธํฌ์ธํธ๊ฐ ์ ์ ์๋ฃ๋ ํ ์คํ
( ๋ฉ์๋ ์คํ์ด ์์ธ์์ด ์ ์์ ์ผ๋ก ๋ฐํ๋ ์ดํ ๊ณตํต ๊ธฐ๋ฅ์ ์คํ )
< returning ์์ฑ์ ์ฌ์ฉ๋ ์ด๋ฆ = ์ด๋๋ฐ์ด์ค ๋ฉ์๋์ ๋งค๊ฐ๋ณ์ ์ด๋ฆ > ์ด์ด์ผํจ
returning ์ ์ ์ง์ ๋ ํ์ ์ ๊ฐ์ ๋ฐํํ๋ ๋ฉ์๋๋ง ๋์์ ์คํ
โ๏ธ After throwing
๋ฉ์๋ ์คํ์ด ์์ธ๋ฅผ ๋์ ธ ์ข
๋ฃ๋ ๊ฒฝ์ฐ์ ์คํ
( ๋ฉ์๋๋ฅผ ์คํํ๋ ๋์ค ์์ธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ๊ณตํต ๊ธฐ๋ฅ์ ์คํ )
< throwing ์์ฑ์ ์ฌ์ฉ๋ ์ด๋ฆ = ์ด๋๋ฐ์ด์ค ๋ฉ์๋์ ๋งค๊ฐ๋ณ์ ์ด๋ฆ > ์ด์ด์ผํจ
throwing ์ ์ ์ง์ ๋ ํ์ ๊ณผ ๋ง์ ์์ธ๋ฅผ ๋์์ผ๋ก ์คํ
โ๏ธ After (finally)
์กฐ์ธ ํฌ์ธํธ์ ๋์๊ณผ๋ ์๊ด์์ด ๋ฉ์๋ ์คํ ํ ๊ณตํต ๊ธฐ๋ฅ ์คํ
( ์คํ ๊ฒฐ๊ณผ๊ฐ ์ ์, ์์ธ์๋ ์๊ด X )
( ์์ธ ๋์์ finally๋ฅผ ์๊ฐํ๋ฉด ๋จ )
๋ณดํต ๋ฆฌ์์ค ํด์ ํ๋๋ฐ ์ฌ์ฉ
โ๏ธ Around
๋ฉ์๋ ํธ์ถ ์ /ํ, ์์ธ ๋ฐ์ ์์ ์ ๊ณตํต ๊ธฐ๋ฅ ์คํ
Ex. ์กฐ์ธ ํฌ์ธํธ ์คํ ์ฌ๋ถ ์ ํ, ๋ฐํ ๊ฐ ๋ณํ, ์์ธ ๋ณํ ๋ฑ
๊ฐ์ฅ ๊ฐ๋ ฅํ ์ด๋๋ฐ์ด์ค
์ด๋๋ฐ์ด์ค์ ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ ProceedingJoinPoint
์ฌ์ฉํด์ผํจ
proceed()
๋ฅผ ํตํด ๋์ ์คํํ๊ณ ์ฌ๋ฌ๋ฒ ์คํ ๊ฐ๋ฅ
๐ก ์ฌ์ค @Around๋ง ์์ด๋ ๋ชจ๋ ๊ธฐ๋ฅ ์ํ ๊ฐ๋ฅ
But, ๊ณ ๋ คํด์ผํ ์ฌํญ์ด ์์ ๋ ์ ์์ ์ผ๋ก ์๋์ด ๋์ง ์๋ ๊ฒฝ์ฐ ์์
โ
@Before / @After ๊ณผ ๊ฐ์ ์ด๋๋ฐ์ด์ค๋ ๊ธฐ๋ฅ์ ์ ์ง๋ง ์ฝ๋๋ ๋จ์ํ๊ณ , ์ํ๋ ๋๋ก ์๋ํ๋ฉฐ ๊ฐ๊ฐ์ด ์ ๋ํ ์ด์ ๋ง ๋ด๋ ์ด๋ค ์ผ์ ํ๋์ง ๋ช ํํ๊ฒ ํ์ ๊ฐ๋ฅ
โ
โ ์ข์ ์ค๊ณ๋ @Around๋ง ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ์ ์ฝ์ ๊ฐ์ง๋๋ผ๋ ๋ฌธ์ ์์ฒด๊ฐ ๋ฐ์ํ์ง ์๊ณ ์ญํ ์ ๋ช ํํ๊ฒ ํ์ฌ ์ค์๋ฅผ ์ฌ์ ์ ๋ฐฉ์งํ๋ ๊ฒ์
์กฐ์ธํฌ์ธํธ(Join Point)์์ ์ด๋๋ฐ์ด์ค(Advice)๊ฐ ์ ์ฉ๋ ์์น๋ฅผ ์ ๋ณํ๋ ๊ธฐ๋ฅ
( ์ ํ๋ฆฌ์ผ์ด์
์คํ ํ๋ฆ์์ AOP๋ฅผ ์ ์ฉํ ์ ์๋ ๋ชจ๋ ํฌ์ธํธ์์ ์ํ๋ ๋ถ๊ฐ๊ธฐ๋ฅ ์ฝ๋์ ์์น๋ฅผ ์ ๋ณํ๋ ๊ธฐ๋ฅ )
๊ด์ฌ ์กฐ์ธํฌ์ธํธ๋ฅผ ๊ฒฐ์ โ ์ด๋๋ฐ์ด์ค๊ฐ ์คํ๋๋ ์๊ธฐ ์ ์ด ๊ฐ๋ฅ
๋ฉ์๋ ์คํ ์ง์ ๋ง ํฌ์ธํธ์ปท์ผ๋ก ์ ๋ณ ๊ฐ๋ฅ
AspectJ ํํ์์ ์ฌ์ฉํด์ ์ง์
( &&, ||, ! ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐํฉ ๊ฐ๋ฅ )
๐ก build.gradle ํ์ผ์ dependencies์
implementation 'org.springframework.boot:spring-boot-starter-aop'
์ถ๊ฐํด์ผ AspectJ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ๊ฐ๋ฅ !
execution
โ ๋ฉ์๋ ์คํ ์กฐ์ธํธ ํฌ์ธํธ ๋งค์นญ
โ ์คํ๋ง AOP์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ, ๊ธฐ๋ฅ๋ ๋ณต์ก
within
โ ํน์ ํ์
๋ด์ ์กฐ์ธ ํฌ์ธํธ ๋งค์นญ
args
โ ์ธ์๊ฐ ์ฃผ์ด์ง ํ์
์ ์ธ์คํด์ค์ธ ์กฐ์ธ ํฌ์ธํธ
this
โ ์คํ๋ง ๋น ๊ฐ์ฒด(์คํ๋ง AOP ํ๋ก์)๋ฅผ ๋์์ผ๋ก ํ๋ ์กฐ์ธ ํฌ์ธํธ
target
โ Target ๊ฐ์ฒด(์คํ๋ง AOP ํ๋ก์๊ฐ ๊ฐ๋ฅดํค๋ ์ค์ ๋์)๋ฅผ ๋์์ผ๋ก ํ๋ ์กฐ์ธ ํฌ์ธํธ
@target
โ ์คํ ๊ฐ์ฒด์ ํด๋์ค์ ์ฃผ์ด์ง ํ์
์ ์ ๋ํ
์ด์
์ด ์๋ ์กฐ์ธ ํฌ์ธํธ
@within
โ ์ฃผ์ด์ง ์ ๋ํ
์ด์
์ด ์๋ ํ์
๋ด ์กฐ์ธ ํฌ์ธํธ
@annotation
โ ๋ฉ์๋๊ฐ ์ฃผ์ด๋ ์ ๋ํ
์ด์
์ ๊ฐ์ง๊ณ ์๋ ์กฐ์ธ ํฌ์ธํธ๋ฅผ ๋งค์นญ
@args
โ ์ ๋ฌ๋ ์ค์ ์ธ์์ ๋ฐํ์ ํ์
์ด ์ฃผ์ด์ง ํ์
์ ์ ๋ํ
์ด์
์ ๊ฐ๋ ์กฐ์ธ ํฌ์ธํธ
bean
โ ์คํ๋ง ์ ์ฉ ํฌ์ธํธ์ปท ์ง์์
โ ๋น์ ์ด๋ฆ์ผ๋ก ํฌ์ธํธ์ปท์ ์ง์
โ
โ execution์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๊ณ ๋๋จธ์ง๋ ์์ฃผ ์ฌ์ฉํ์ง ์์ !
(..)
โ ๋ชจ๋ ๋งค๊ฐ๋ณ์
*(..)
โ ๋ชจ๋ ๋ฉ์๋ ์ ํ
(*)
โ ๋ฐ๋์ 1๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง๋ ๋ฉ์๋๋ง ์ ํ
- ๋ชจ๋ ๊ณต๊ฐ ๋ฉ์๋ ์คํ
โexecution(public * *(..))
โ - set ๋ค์ ์ด๋ฆ์ผ๋ก ์์ํ๋ ๋ชจ๋ ๋ฉ์๋ ์คํ
( ๋ฉ์๋๋ช ์ด set~~์ผ๋ก ์์ํ๋ ๋ชจ๋ ๋ฉ์๋ )
โexecution(* set*(..))
โ - AccountService ์ธํฐํ์ด์ค์ ์ํด ์ ์๋ ๋ชจ๋ ๋ฉ์๋์ ์คํ
โexecution(* com.xyz.service.AccountService.*(..))
( ํ์ผ ์์น๊ฐ com.xyz.service ํจํค์ง์ AccountService ์ธํฐํ์ด์ค์ธ ๊ฒ )
โ - service ํจํค์ง์ ์ ์๋ ๋ฉ์๋ ์คํ
โexecution(* com.xyz.service.*.*(..))
( ํ์ผ ์์น๊ฐ com.xyz.service ํจํค์ง )
โ - service ํจํค์ง ๋๋ ํด๋น ํ์ ํจํค์ง ์ค ํ๋์ ์ ์๋ ๋ฉ์๋ ์คํ
โexecution(* com.xyz.service..*.*(..))
โ - service ํจํค์ง ๋ด์ ๋ชจ๋ ์กฐ์ธ ํฌ์ธํธ
(Spring AOP์์๋ง ๋ฉ์๋ ์คํ)
โwithin(com.xyz.service.*)
โ - service ํจํค์ง ๋๋ ํ์ ํจํค์ง ์ค ํ๋ ๋ด์ ๋ชจ๋ ์กฐ์ธ ํฌ์ธํธ
(Spring AOP์์๋ง ๋ฉ์๋ ์คํ)
โwithin(com.xyz.service..*)
โ - AccountService ํ๋ก์๊ฐ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๋ชจ๋ ์กฐ์ธ ํฌ์ธํธ
(Spring AOP์์๋ง ๋ฉ์๋ ์คํ)
โthis(com.xyz.service.AccountService)
โ - AccountService ๋์ ๊ฐ์ฒด๊ฐ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๋ชจ๋ ์กฐ์ธ ํฌ์ธํธ
(Spring AOP์์๋ง ๋ฉ์๋ ์คํ)
โtarget(com.xyz.service.AccountService)
โ - ๋จ์ผ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๊ณ ๋ฐํ์์ ์ ๋ฌ๋ ์ธ์๊ฐ Serializable๊ณผ ๊ฐ์ ๋ชจ๋ ์กฐ์ธ ํฌ์ธํธ
(Spring AOP์์๋ง ๋ฉ์๋ ์คํ)
โargs(java.io.Serializable)
โ - ๋์ ๊ฐ์ฒด์ @Transactional ์ ๋ํ ์ด์ ์ด ์๋ ๋ชจ๋ ์กฐ์ธ ํฌ์ธํธ
(Spring AOP์์๋ง ๋ฉ์๋ ์คํ)
โ@target(org.springframework.transaction.annotation.Transactional)
โ - ์คํ ๋ฉ์๋์ @Transactional ์ ๋ํ ์ด์ ์ด ์๋ ์กฐ์ธ ํฌ์ธํธ
(Spring AOP์์๋ง ๋ฉ์๋ ์คํ)
โ@annotation(org.springframework.transaction.annotation.Transactional)
โ - ๋จ์ผ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ณ ์ ๋ฌ๋ ์ธ์์ ๋ฐํ์ ์ ํ์ด @Classified ์ ๋ํ ์ด์ ์ ๊ฐ๋ ์กฐ์ธ ํฌ์ธํธ
(Spring AOP์์๋ง ๋ฉ์๋ ์คํ)
โ@args(com.xyz.security.Classified)
โ - memberService ๋ผ๋ ์ด๋ฆ์ ์คํ๋ง ๋น์ ๋ชจ๋ ์กฐ์ธ ํฌ์ธํธ
(Spring AOP์์๋ง ๋ฉ์๋ ์คํ)
โbean(memberService)
โ - ์์ผ๋ ํํ์
*Service
๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง ์คํ๋ง ๋น์ ๋ชจ๋ ์กฐ์ธ ํฌ์ธํธ
( ~~Service๋ก ๋๋๋ ์ด๋ฆ์ ๋น๋ค )
โbean(*Service)
ํ๋์ ์ด๋๋ฐ์ด์ค(Advice) + ํ๋์ ํฌ์ธํธ์ปท(Pointcut) ์ผ๋ก ๊ตฌ์ฑ
( ์ํ ์ฝ๋(๋ถ๊ฐ๊ธฐ๋ฅ) + ๊ทธ ์ฝ๋์ ์์น ์ ๋ณ ๊ธฐ๋ฅ )
์คํ๋ง AOP์์๋ง ์ฌ์ฉ๋๋ ํน๋ณํ ์ฉ์ด
ํต์ฌ ๊ธฐ๋ฅ์ ๋ด๊ณ ์๋ ๋ชจ๋
( ๋ถ๊ฐ๊ธฐ๋ฅ(Advice)์ด ์ ์ฉ๋ ๊ฐ์ฒด )
ํฌ์ธํธ์ปท(Pointcut)์ผ๋ก ์ด๋ ํ๊ฒ์ ๋ค์ด๊ฐ์ง ๊ฒฐ์ ๋จ
( ์์น ์ ๋ณ ๊ธฐ๋ฅ์ผ๋ก ๊ฒฐ์ )
โ ํ๋ก์ ๋ฐฉ์์ ํตํด์ AOP๊ฐ ๊ตฌํ๋๋ ๊ณผ์
- ์ปดํ์ผ ํ์
โ .java ํ์ผ -> .class ํ์ผ๋ก ์ปดํ์ผ๋๋ ์์ ์ Aspect๊ฐ ์ฝ์ ๋
โ ์คํ๋ง AOP์์๋ ์ฌ์ฉ ๋ถ๊ฐ / AspectJ ์ฌ์ฉํ ๋ ์ฌ์ฉ
โ - ํด๋์ค ๋ก๋ ํ์
โ ์ปดํ์ผ ์ดํ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๋ ์์ ์ AOP๊ฐ ์ ์ฉ
โ ์คํ๋ง AOP์์๋ ์ฌ์ฉ ๋ถ๊ฐ / AspectJ ์ฌ์ฉํ ๋ ์ฌ์ฉ
โ - ๋ฐํ์(์คํ์ค์ผ ๋) == ํ๋ก์ ๋ฐฉ์
โ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์์ฑํ๊ณ ์๋ณธ ๊ฐ์ฒด ๋์ ํ๋ก์ ๋น์ผ๋ก ๋ฑ๋ก
(IoC๋ฅผ ํตํด์)
์คํ๋ง ์ปจํ ์ด๋๊ฐ ๋น์ ์์ฑํ ๋ ์ด ์์ฒญ์ ํ๋ก์ ๊ฐ์ฒด๊ฐ ๊ฐ๋ก์ฑ์ @Aspect๊ฐ ๋์ด์๋ ๊ฐ์ฒด๋ค์ ์น ๋ชจ์์ ์ฐ ๊ฐ์ฒด์ ๋ฃ์ด์ค
โ๏ธ ํ๋ก์ (Proxy)
- '๋๋ฆฌ' ๋ผ๋ ์๋ฏธ
- ๋ค๋ฅธ ๋ฌด์ธ๊ฐ์ ์ด์ด์ง๋ ์ธํฐํ์ด์ค ์ญํ ์ ํ๋ ํด๋์ค
- ํ๊ฒ์ ๊ฐ์ธ์ ์์ฒญ์ ๋์ ๋ฐ์์ฃผ๋ ๋ฉํ ํด๋์ค
( Spring์์๋ Proxy๋ฅผ ์ด์ฉํด OOP์ 5๋ ์์น ์ค ํ๋์ธ OCP ์ ์ฉ )- ํ๋ก์ ๊ฐ์ฒด = ํต์ฌ ๊ธฐ๋ฅ ์ธ์ ๊ณตํต์ ์ธ ๊ธฐ๋ฅ์ ๋ด์ ๊ฐ์ฒด
( ์ด๋๋ฐ์ด์ค๋ฅผ ํ๊ฒ ๊ฐ์ฒด์ ์ ์ฉํ๋ฉด์ ์์ฑ๋๋ ๊ฐ์ฒด )
โ ์๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ธ์ client์ ์์ฒญ์ ๋์ ์ฒ๋ฆฌํจ
Ex. ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์๋ ์ค์ ์์ฒญ ์ฒ๋ฆฌ ๊ฐ์ฒด์ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , ํ๋ก์ ๊ฐ์ฒด๊ฐ ๋์ ํ์ฌ ์ค์ ์์ฒญ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ง
Spring AOP๋ Proxy์ ๋ฉ์ปค๋์ฆ์ ๊ธฐ๋ฐ์ผ๋ก AOP Proxy๋ฅผ ์ ๊ณตํ๊ณ ์์ !
์ ๊ทธ๋ฆผ์ฒ๋ผ Spring AOP๋ ์ฌ์ฉ์์ ํน์ ํธ์ถ ์์ ์ IoC ์ปจํ
์ด๋์ ์ํด AOP๋ฅผ ํ ์ ์๋ Proxy Bean์ ์์ฑํด์ค
๋์ ์ผ๋ก ์์ฑ๋ Proxy Bean์ ํต์ฌ๊ธฐ๋ฅ ๋ชจ๋(Target)์ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ ์์ ์, ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋ฉ์๋๋ฅผ ์์ฒด์ ์ผ๋ก ํ๋จํ๊ณ ๊ฐ๋ก์ฑ์ด ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ฃผ์ ํจ
โ ํธ์ถ ์์ ์ ๋์ ์ผ๋ก ์๋น์ ํ๋ค๊ณ ํ์ฌ ๋ฐํ์ ์๋น(Runtime Weaving)์ด๋ผ๊ณ ํจ
๋ฐ๋ผ์ Spring AOP๋ ๋ฐํ์ ์๋น์ ๋ฐฉ์์ ๊ธฐ๋ฐ์ผ๋ก ํ๊ณ ์๊ณ ,
Spring์์ ๋ฐํ์ ์๋น์ ํ ์ ์๋๋ก ์ํฉ์ ๋ฐ๋ผ JDK Dynamic Proxy ๋ฐฉ์์ CGLIB ๋ฐฉ์์ ํตํด Proxy Bean์ ์์ฑ์ ํด์ค
Spring์ AOP Proxy๋ฅผ ์์ฑํ๋ ๊ณผ์ ์์ ์์ฒด ๊ฒ์ฆ ๋ก์ง์ ํตํด ํ๊น์ ์ธํฐํ์ด์ค ์ ๋ฌด๋ฅผ ํ๋จํจ
์ด ๋ ์ธํฐํ์ด์ค์ ์ ๋ฌด์ ๋ฐ๋ผ,
ํ๊ฒ(Target)์ด ํ๋ ์ด์์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์๋ ํด๋์ค๋ผ๋ฉด โ JDK Dynamic Proxy ๋ฐฉ์์ผ๋ก,
( But, ๊ธฐ๋ณธ์ ์ผ๋ก Spring์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ์ถ์ฒ )
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ง ์์ ํด๋์ค๋ผ๋ฉด โ CGLIB์ ๋ฐฉ์์ผ๋ก AOP ํ๋ก์๋ฅผ ์์ฑ
[์ฐธ๊ณ ] https://gmoon92.github.io/spring/aop/2019/04/20/jdk-dynamic-proxy-and-cglib.html
ํ๋ก๊ทธ๋๋ฐ ํ ๋, ๋ ์ข์ ๊ฐ์ฒด์งํฅ์ ํ๊ณ ๋ฐ๋ณต์ ์ธ ์์ ์ ํต์ผํด ํ๋ฒ์ ํ์ฌ ํจ์จ์ฑ์ ๋์ด๊ธฐ ์ํด AOP (Aspect Oriented Programming) ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ค.
์ด AOP๋ ํ๋ก์ ํธ ๋ด์ ์ฌ๋ฌ ๊ฐ์ฒด์ ๊ณตํต์ผ๋ก ์ ์ฉ๋๋ ๊ธฐ๋ฅ(Aspect)๋ค๋ง ๊ธฐ๋ฅ๋ณ๋ก ๋ฐ๋ก ๋ฌถ์ด, ํ๋ก์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ํ๋ฒ์ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฒ์ด๋ค.
์ด ๋ ๋ฐ๋ก ๋ฌถ์ Aspect๋ค์ ๊ทธ ๊ธฐ๋ฅ์ ์ด๋์(์ด๋ ํ๊ฒ์) ์ ์ฉํ ์ง ์จ์ค์ผํ๋๋ฐ
( ํ๊ฒ - ๋ฐ๋ก ๋ฌถ์ ๊ณตํต ๊ธฐ๋ฅ๋ค์ ๋ฃ์ด์ค ํต์ฌ ๊ธฐ๋ฅ )
์ด๋ ํฌ์ธํธ์ปท์ ํ์ฉํ์ฌ ๊ทธ ๊ธฐ๋ฅ์ ์ด๋ ์์น์ ๋ฃ์ ๊ฑด์ง ์ ํด์ค ์ ์๊ณ ,
์ด๋๋ฐ์ด์ค๋ฅผ ํ์ฉํ์ฌ ์ธ์ ๋ฃ์ ๊ฑด์ง ์ ํด์ค ์ ์๋ค.
( Ex. ๋ฉ์๋ ํธ์ถ ์ , ํ๋๊ฐ ๋ณ๊ฒฝ ํ ๋ฑ )
์ฌ๊ธฐ์, AOP๊ฐ ์ ์ฉ๋ ์ ์๋ ๋ชจ๋ ์ง์ ์ ์กฐ์ธํฌ์ธํธ๋ผ๊ณ ํ๊ณ ,
๊ทธ๋ฌ๋ฏ๋ก AOP๊ฐ ์ ์ฉ๋ ์ ์๋ ์ง์ == ํฌ์ธํธ์ปท์ ๋ฃ์ ์ง์ ์ด ๋๊ธฐ ๋๋ฌธ์
์ฆ, ํฌ์ธํธ์ปท์ ํ์ฉํ ์ ์๋ ๋ชจ๋ ์ง์ ์ ์กฐ์ธํฌ์ธํธ๋ผ๊ณ ํ ์ ์๋ค.
[์ฐธ๊ณ ] https://pangtrue.tistory.com/m/80
Q1 ) AOP ๊ฐ๋ ์ ์ ์ฉํ ๋, Proxy ๊ฐ์ฒด๊ฐ ์์ฒญ์ ๋์ ๊ฐ๋ก์ฑ์ ์ฒ๋ฆฌํ๋ค๊ณ ํ๋๋ฐ, ์ ๋ฐ๋ก ์๋ ๊ฐ์ฒด์ ๋ฃ์ง ์๊ณ Proxy ๊ฐ์ฒด๋ฅผ ํตํด ๋ฃ์ด์ฃผ๋ ๊ฑธ๊น?
โ
Answer1 )
๋จผ์ Proxy ๊ฐ์ฒด๋ ์๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ธ๋ ํํ๋ก ๋ง๋ค์ด์ง๋๋ฐ, ์ด Proxy ํจํด์ ์ฌ์ฉํ๋ ์ด์ ๋ ์ ๊ทผ์ ์ ์ดํ๊ณ ์ถ๊ฑฐ๋, ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋ ์ฌ์ฉ๋จ.
์ฆ, Proxy ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๊ณตํต ๋ก์ง๊ณผ ๋น์ฆ๋์ค ๋ก์ง์ด ๋ถ๋ฆฌ๋์ด ์ญํ ๋ถ๋ฆฌ๊ฐ ๋๊ณ ์ฝ๋๋ ๊น๋ํด์ง๊ธฐ ๋๋ฌธ์ Proxy ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ธ ๊ฒ.
โ
์๋ฅผ ๋ค์ด,Service
๋ผ๋ ์์ ์ธํฐํ์ด์ค๊ฐ ์๊ณ , ์ด๋ฅผ ๊ตฌํํMemberSevice
๋ผ๋ ํ์ ์ธํฐํ์ด์ค๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์ ๋,
์ด ์ฝ๋๋ฅผ ์คํ์ํค๋main()
์ด client๋ผ๊ณ ๋ณผ ์ ์๊ณ ,MemberService
๊ฐ ์๋ ๊ฐ์ฒด๋ผ๊ณ ๋ณผ ์ ์๋ค.
์ด ๋ ์๋ ๊ฐ์ฒด์ธMemberService
์ ๋ฉ์๋๋ค์ ๋์ผํ ๊ธฐ๋ฅ์ ํ๋ ์ฝ๋๋ฅผ ๋ฃ๊ณ ์ถ์ ๊ฒฝ์ฐ, ๊ฐ๊ฐ์ ๋ฉ์๋์ ๋ฃ์ด์ฃผ๋ ๊ฒ์ ํจ์จ์ฑ์ด ๋จ์ด์ง๋ค.
๋ฐ๋ผ์ ์ด ๊ฒฝ์ฐ Proxy ํจํด์ ์ฌ์ฉํ๋ค.
Proxy ๊ฐ์ฒด๋ ์๋ ๊ฐ์ฒดMemberService
์ ๊ฐ์ ์์ ์ธํฐํ์ด์คService
๋ฅผ ๊ตฌํํด์ค์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด Proxy ๊ฐ์ฒด ์์ ์๋ ๊ฐ์ฒดMemberService
๋ฅผ ์ฃผ์ ๋ฐ์์ ๊ทธ ์์ ๋ฉ์๋๋ค์ ์์๋ฐ์ ์ฌ์ฉํ๊ณ , ์ํ๋ ์ถ๊ฐ ์ฝ๋๋ฅผ Proxy ๊ฐ์ฒด์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
โ
[์ฐธ๊ณ ] https://velog.io/@max9106/Spring-%ED%94%84%EB%A1%9D%EC%8B%9C-AOP-xwk5zy57ee
Q2 )
JoinPoint
๋ AOP๋ฅผ ์ ์ฉํ ์ ์๋ ๋ชจ๋ ํน์ ์ง์ ์ด๊ณ ,Pointcut
์ ์กฐ์ธํฌ์ธํธ์์ ์ด๋๋ฐ์ด์ค๊ฐ ์ ์ฉ๋ ์์น๋ฅผ ์ ๋ณํ๋ ๊ธฐ๋ฅ์ธ๋ฐ,
๊ทธ๋ ๋ค๋ฉดPointcut
์ ๊ฒฐ๊ตญ ์ด๋๋ฐ์ด์ค๊ฐ ์ ์ฉ๋ ์์น ์ฆ, AOP๊ฐ ์ ์ฉ๋ ์ ์๋ ์์น๋ฅผ ์ ๋ณํ๋ ๊ธฐ๋ฅ์ด๋ผ๊ณ ์๊ฐํ์ฌ
JoinPoint ์ Pointcut์ ์ฐจ์ด์ ์ด ๋๋ฌด ํ๊ฐ๋ ธ๋ค.
โ
Answer2 )
JoinPoint๊ฐ Advice๊ฐ ์ ์ฉ๋ ์ ์๋ ๋ชจ๋ ์์น๋ค(AOP ์ ์ฉ ์ง์ ์ ๋ํ ๋ฉํ์ ์ธ ์ ๋ณด)์ด๊ณ ,
Pointcut์ ์ข ๋ ๊ตฌ์ฒด์ ์ธ ์ ์ฉ ์ง์ ์ผ๋ก ํน์ ๋ฉ์๋์ ์ด๋์ ์ด๋๋ฐ์ด์ค๊ฐ ์ ์ฉ๋ ์ ์๋ ์ง์ ๋ํ ์ ๋ณด์ด๋ค.
โ
์๋ฅผ ๋ค์ด์MemberService
์hello()
๋ผ๋ ๋ฉ์๋ ์คํ ์ ,ํ์ hello์ bye๋ฅผ ์ถ๋ ฅํ๋ ์ผ์ ํ๋ค๊ณ ๊ฐ์ ํ ๋,
MemberService
๋น = Target
"hello()
๋ฉ์๋ ์คํ ์ ,ํ" = ํฌ์ธํธ์ปท
"๋ฉ์๋ ์คํ ์ ,ํ" = ์กฐ์ธํฌ์ธํธ
"hello๋ bye๋ฅผ ์ถ๋ ฅํ๋ ์ผ" = Advice
์ธ ๊ฒ์ด๋ค.
Q3 )
AnnotationConfigApplicationContext
์ApplicationContext
์ ์ฐจ์ด์ /
๋ฐ์ ์ฝ๋์์AnnotationConfigApplicationContext
๋ก๋ง ์ ์ํด๋ ๋๋๋ฐApplicationContext
๋ก ๋ง๋๋ ์ด์ ๊ฐ ๊ถ๊ธํ๋ค.AnnotationConfigApplicationContext acac = new AnnotationConfigApplicationContext(AppConfig.class); โ ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
Answer3 )
์ด ์ ํ๋ฅผ ๋ณด๊ณ ์์ ํ์ ๊ด๊ณ๋ผ๋ ๊ฑด ์์๋๋ฐ ์ด ์ดํ๋ก๋ ์ดํด๊ฐ ๊ฐ์ง ์์ ์ฐพ์๋ณด์๋๋ฐ, ๋์ ๊ฐ์ ๊ถ๊ธ์ฆ์ ๊ฐ์ง ์ฌ๋์ด ์์๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ํ์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๊ทธ ๊ตฌํ์ฒด๊ฐ ์์ ๋์ด ๋ค๋ฅธ ํ์ ์ธํฐํ์ด์ค๋ก ๋ฐ๋์ด๋ ๊ฒฐ๊ตญ์ ๊ทธ๊ฒ๋ ์ ์์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์๊ธฐ ๋๋ฌธ์,
์์ ์ธํฐํ์ด์ค์ ๊ธฐ๋ฅ(๋ฉ์๋)์ด ๋ณํ์ง ์๋ ์ด์ ์์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ธฐ๋ฅ๋ค์ ๋ณ๊ฒฝํ ์ผ์ด ์์ด์ ธ์
๋์ค์ ๊ตฌํ์ฒด๋ฅผ ์์ ํ๋๋ผ๋ ๊ทธ ๊ตฌํ์ฒด๋ง์ ๋ฉ์๋๋ง ์์ ํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์ข ๋ ์์ ํ ์ผ์ด ์ ์ด์ง๋ค !
โ
๋ ์ถ๊ฐ์ ์ผ๋ก, ์์ ์ธํฐํ์ด์ค์ธApplicationContext
๋ฅผ ํตํด ์คํ๋ง ์ปจํ ์ด๋ ํ์์ ์ ์ฅํ๋ฉดgetBeanDefinition()
๋ฉ์๋๊ฐ ์ฌ์ฉ์ด ์๋๋ ์ฃผ์ํ์ !
์ค๋ ์ค์ต์ ํ๋ฉด์ ์ง์ ์ฝ๋๋ฅผ ์น๊ณ ์ด๋ค ์ํฉ์์ ์ฐ์ด๋์ง ์ข ๋ ์ ์ดํด๊ฐ ๋๋ค!!
์ญ์ ์ง์ ๋ง์ด ์ณ๋ด์ผํ๋๋ณด๋ค
์ค์ต ๋ด์ฉ์ Project ํด๋ ๋ด์ aop !!