5. AOP์LTW
5. AOPDHK LTW(๋ก๋ํ์ ์๋น)
5.1 ์ ์คํํธ AOP
ํ๋ก์ ๊ธฐ๋ฐ AOP
์คํ๋ง์ JDK ๋์ ํ๋ก์๋ฅผ ์ด์ฉํ์ฌ, ๋ฐ์ดํธ ์ฝ๋ ์กฐ์์์ด ์ ์ฉํ AOP ๊ธฐ๋ฅ์ ์ ๊ณต
๋ฐ์ฝ๋ ์ดํฐ ํจํด๊ณผ ํ๋ก์ํจํด์ ์์ฉ์ ์ฐ๋ฌผ...
Pointcut๊ณผ ์๋ฑํ๋ก์์์ฑ(Advice+Pointcut ์กฐํฉ) => AOP๊ธฐ๋ฅ
๊ตฌํ
๊ฐ์ฅ ๊ธฐ์ด์ ์ธ ํ๋ก์ AOP ๊ฐ๋ฐ AOP์ ์ฐธ์ฌํ๋ ๊ตฌ์ฑ์์ (ํฌ์ธํธ์ปท, ์ด๋๋ฐ์ด์ค)๋ฅผ
ํด๋์ค ์์ฑ -> Bean ๋ฑ๋ก
์ด๋๋ฐ์ด์ค์ ํฌ์ธํธ์ปท์ M:N
์ผ๋ก ์ ์ฉ๋ ์ ์๋ค. ๊ฐ๋จํ AOP ๊ธฐ๋ฅ์๋น ํด๋์ค ๊ตฌํ
๊ณผ๋น ๋ฑ๋ก
์ผ๋ก ๊ตฌํ์ด ์ถฉ๋ถํ ๊ฐ๋ฅ 1. ํฌ์ธํธ์ปท : ํด๋์ค ์์ฑ -> ๋น ๋ฑ๋ก : ์คํ๋ง์ AspectJ์ ํํ์ ์ฐจ์ฉ -> AspectJExpressionPointcut ์ฌ์ฉ 2. ์ด๋๋ฐ์ด์ค : ํด๋์ค ์์ฑ -> ๋น ๋ฑ๋ก 3. ํฌ์ธํธ์ปท + ์ด๋๋ฐ์ด์ค = ์ด๋๋ฐ์ด์ : ๋น๋ฑ๋ก๋ ์ด๋๋ฐ์ด์ค + ํฌ์ธํธ์ปท -> ์ด๋๋ฐ์ด์ ๋น๋ฑ๋ก 4. ์๋ํ๋ก์์์ฑ๊ธฐ : ์ด๋๋ฐ์ด์ -> ์๋ํ๋ก์ ์์ฑ๊ธฐ ๋น์ ๋ฑ๋กAOP ์ธํฐํ์ด์ค ๊ตฌํ๊ณผ aop ๋ค์์คํ์ด์ค์
<aop:advisor>
ํ๊ทธ๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ ์ด๋๋ฐ์ด์ค๋ Adivce ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋๋ฐฉ์ ํฌ์ธํธ์ปท, ์ด๋๋ฐ์ด์ , ํ๋ก์์๋์์ฑ๊ธฐ -> ๋น ๋ฑ๋ก -> aop์คํค๋ง์ ์ ์ฉ ํ๊ทธ๋ง์ผ๋ก..<bean>
๋ฑ๋ก๋ณด๋ค ๊ฐ๊ฒฐํ๊ณ ๋ช ํํ๊ธฐ ๋๋ฌธ์ ์์ฃผ์ฌ์ฉํ๋ ๋ฐฉ์<aop:advisor>
: ์ด๋๋ฐ์ด์ค ๋น ์ฐธ์กฐ + ํฌ์ธํธ์ปท ์์ฑ or ํฌ์ธํธ์ปท ์ฐธ์กฐ ๋ฑ๋ก<aop:pointcut>
: ํฌ์ธํธ์ปท -> ๋ฐ๋ก ๋ ๋ฆฝ์ ๊ตฌํ ๊ฐ๋ฅ. ์ข ์์ ์ผ๋ก ์ด๋๋ฐ์ด์ ์ ๋งคํ ๊ฐ๋ฅ<aop:config>
: ์๋ํ๋ก์์์ฑ๊ธฐ ๋น์ ํด๋น
์์์ ์๋ฐ ํด๋์ค์ aop ๋ค์์คํ์ด์ค์
<aop:aspect>
๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ 2๋ฒ์งธ์ ๋์ผํ๊ฒ aop ์คํค๋ง๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๊ธฐ์กด์ ์ด๋๋ฐ์ด์ค, ์ด๋๋ฐ์ด์ ๊ฐ๋ ๋์aspect
๊ฐ๋ ์ ์ด์ฉ ์คํ๋ง์ OOP ๊ฐ๋ ์ผ๋ก ์ ๊ทผ์ํ์ฌ ํ๋ก์์ ๋ต์ ํ์ฉํ์ฌ AOP๋ฅผ ๊ตฌํ์ค ... ๊ทธ๋ฌ๋ AspectJ์ ํ์ฅ์ธ์ด๋ฅผ ์งํฅํ๋ AOP์์๋์ ์คํํธ
๋ผ๋ AOP ๋ชจ๋์ ์ ์ํ๋ ๋ฐฉ๋ฒ์ ์ด์ฉ์ ์คํํธ
๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ผ๋ฐ ์๋ฐ ํด๋์ค๋ฅผ ์ด์ฉํ์ฌ ์ ์ ํ ์ ์์ง๋ง, ํน์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํ์๊ฐ ์์ด ๊ทธ๋ฅ 1.์ ๋ ธํ ์ด์ , 2.XML์ aop:aspect ํ๊ทธ๋ฅผ ์ด์ฉํ์ฌ ์๋ฐํด๋์ค -> AOP ์ ์คํํธ๋ก ๋ง๋ค ์ ์์@Aspect ์ ๋ ธํ ์ด์ ์ ์ด์ฉํ๋ ์ ์คํํธ ๊ฐ๋ฐ ๋ฐฉ๋ฒ
@AspectJ
๋ ์ด๋ฆ ๊ทธ๋๋ก AspectJ AOP ํ๋ ์์ํฌ์์ ์ ์๋ ์ ๋ ธํ ์ด์ ์ ์ด์ฉํ๋ค. ํ์ง๋ง @AspectJ ๋ฌธ๋ฒ๊ณผ ์ ์คํํธ ์ ์ ๋ฐฉ๋ฒ๋ง ์ฐจ์ฉ ํ์ ๋ฟAspectJ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์๋๋ค
. ์ฆ, @AspectJ ์ ๋ ธํ ์ด์ ๋ฐฉ์๋ ์คํ๋ง์ ํ๋ก์ ๊ธฐ๋ฐ AOP๋ฅผ ์ฌ์ฉํ๋ค.@AspectJ๊ฐ AspectJ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋์ ์ฃผ์
์ฒซ๋ฒ์งธ ๋ฐฉ์์ด ๊ฐ์ฅ ๊ตฌ์์ด๋ฏ๋ก ์ค์ ์์๋ ์ฌ์ฉ์ ๋ฐฐ์ ํ๊ณ , 2,3,4๋ฒ์งธ์์ ์ฌ์ฉํ๊ธฐ๋ฅผ ๊ถ์ฅํ๋ค. XML์ 2,3๋ฒ / ์ ๋ ธํ ์ด์ ์ 4๋ฒ 2๋ฒ์งธ ๊ฐ์ ๊ฒฝ์ฐ Advice ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ ์ด๋๋ฐ์ด์ค๋ฅผ ์ด์ฉ (์คํ๋ง์ ํธ๋์ญ์ AOP๋ ์ด๋ฐฉ๋ฒ์ ์ฌ์ฉํจ) 3๋ฒ์งธ ๊ฐ์ ๊ฒฝ์ฐ ์ ์คํํธ ๋ฐฉ์์ธ๋ฐ, ์ข ๋ ์ ์ฐํ๊ฒ AOP๋ฅผ ์ ์ฉํ ์ ์๋ค. (๋จ์ ์, ๋๋ฒ๊น ์ ์ด๋ ค์, ๋ฌ๋์ปค๋ธ) -> ๋ณดํต์ ์ด๋ฐฉ์์ ์ฑํํ๋ค
๊ฒฐ๋ก
XML -> 3๋ฒ์งธ (aop:aspect
)
์ ๋
ธํ
์ด์
-> 4๋ฒ์งธ (@Aspect
)
ํฌ์ธํธ์ปท -> AspectJ ํํ์
์ ์ฌ์ฉํ๋๊ฒ ๊ฐ์ฅ ํธ๋ฆฌ (execution, bean, anotation ๋ฑ
)
Spring AOP -> ์ด๋ค ๋ฐฉ์์ ์ฌ์ฉํ๋ ํ๋ก์ ๊ธฐ๋ฐ์ AOP์ด๋ผ๋ ์ ์ ์
Spring์ ํ๋ก์ ๊ฐ๋
-> ๋ฐ์ฝ๋ ์ดํฐ ํจํด์์ ๋์จ๊ฒ์ด๊ณ , ๋์์๋ฆฌ๋ JDK ๋์ ํ๋ก์์ DI ์ด์ฉ
Client -> Target์ ํธ์ถํ ๋,
Client -> Proxy -> Target (ํ๋ก์๊ฐ ๊ด์ฌํ์ฌ ๊ฐ๋ก์ฑ
)
ํ๋ก์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋ ๊ฒฝ์ฐ @Autowired๋ก Target์ ์ฃผ์ ํ ๋ ๋ฌธ์ ๊ฐ ๋๋๋ฐ, ๊ทธ ์ด์ ๋ Target์ ํด๋นํ๋ ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๊ฐ 2๊ฐ ์ด์์ผ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์๋ํ๋ก์ ์์ฑ๊ธฐ๋ฒ์ผ๋ก..? ์ปจํ ์ด๋ ์ด๊ธฐํ๋ ๋ฑ๋ก๋ ๋น๋ค์ ๋ก๋ฉ -> ์ด๋ ํ๋ก์๋ฅผ ์๋์์ฑํ์ฌ ๋ฑ๋ก -> ๋น์ ํ์ ํฌ์ธํธ์ปท์ด.. / ๋น ํ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์๋ ๋น์ ์์กด๊ด๊ณ ๋ฐ๊ฟ์น๊ธฐ
์๋์ผ๋ก ๋ฑ๋กํ ํ๋ก์ ๋น๊ณผ ์๋ํ๋ก์์์ฑ์ ์ฐจ์ด
์๋ : ๋น์ ์ง์ ๋ฑ๋ก, ํ๊น, ํ๋ก์ ์๋ : ๋น์ผ๋ก ๋ฑ๋ก๋ ํ๊ฒ์ ์๊ธฐ๊ฐ ๋์ฒดํจ. ํ๋ก์ ๋น ๋ฑ๋กํ์ง ์์ (๋น์ด ์ง์ ์ ์ผ๋ก ๋
ธ์ถ๋์ง ์๋๋ค๋ ์ ์ด ๋ค๋ฆ)
-> @Autowired ์ฌ์ฉ์ ๋ฐ๋ฅธ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๊ฒ ๋๋ค -> ํ๋ก์๋ ๊ทผ๋ณธ์ ์ผ๋ก ํ๊ฒ๊ณผ ๋์ผํ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ฒ ๋๋๋ฐ, ์ด๋ ํ๋ก์๋น์ ์์ํ์
์ธ ์ธํฐํ์ด์ค์ ํ์
์ ๊ฐ๊ฒ ๋ ๋ฟ, ๊ตฌํ์ฒด์ ํ์
์ ๊ฐ์ง๋ ์๋๋ค. ๋ฐ๋ผ์ ์๋์์ฑ๋์ ๋์ฒด๋๋ ํ๋ก์ ๋น์ Interface ํ์
์ผ ๋ฟ Target ํ์
์ ์๋๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์ธํฐํ์ด์ค ํ์
์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋์ง๋ ์์ง๋ง, ํ์ํ์
์ธ์ธ ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ
DI ๊ธฐ์ ์ ๋ํ ๋ฌธ์ ๋ ์์ผ๋, ์๋ํ๋ก์์ ์ํด ๊ทธ ํ๊ฒ์ด ํ๋ก์๋น์ผ๋ก ๊ฐ์ถฐ์ง๊ฒ ๋๋ฉด ์ปจํ
์ด๋ ์ด๊ธฐํ ๊ณผ์ ์์ ์์ธ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
ํ๋ก์
ํ๋ก์ ์์ฑ์ํ ๋, ํ๊น์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์๋ค๋ฉด, ํ๋ก์๋ ๊ทธ ์ธํฐํ์ด์ค ํ์ ์ ๊ฐ๊ฒ ๋์ง๋ง, ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ง ์๊ณ ์๋ค๋ฉด CGLib๋ฅผ ์ด์ฉํ ํด๋์ค ํ๋ก์๋ฅผ ๋ง๋ ๋ค.
๊ฐ์ ๋ก ํด๋์ค ํ๋ก์๋ฅผ ๋ง๋ค๋๋ก ํ ์ ์๋ค. (1๋ฒ์์ ํ์) ํด๋์ค ํ๋ก์๋ฅผ ๊ฐ์ ํ๋ฉด ->
์ธํฐํ์ด์ค๊ฐ ์๋๋ผ๋ ๋ฌด์ํ๊ณ
ํด๋์ค๋ฅผ ํ๋ก์๋ก ๋ง๋ ๋ค -> aop ์คํค์ ์ฌ์ฉ์aop:config
์์proxy-target-class="true"
๋ก ์ค์ ์ ํ๋ฉด ๋๋ค.์ ๋ ธํ ์ด์ AOP ๋ฐฉ์์ @Transactional ->
<tx:annotation-driven>
์๋proxy-target-class="true"
๋ฅผ ์ฃผ๋ฉด ์ธํฐํ์ด์ค์ ์กด์ฌ์ ์๊ด์์ดํด๋์ค ํ๋ก์
๋ฅผ ์์ฑ. ์ด๋ํ๋ก์์ ํ์ ์
ํ๊น์ค๋ธ์ ํธ์ ํ์ ๊ณผ ๋์ผํ๋ค
@AspectJ AOP
Aspect
๋, OOP์ ํด๋์ค์ ๋น์ทํ ๊ฐ๋
์ด๋ผ๊ณ ์๊ฐํ๋ฉด ์ฝ๋ค. ๊ทธ ์์ฒด๋ก ํต์ฌ๊ธฐ๋ฅ์ ์๋์ง๋ง ๋ง์ ์ค๋ธ์ ํธ์ ๊ฑธ์ณ์ ํ์ํ ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ถ์ํ
ํด๋์ ๊ฒ.
Aspect
๋ ํ๋์ด์์ ํฌ์ธํธ์ปท๊ณผ ์ด๋๋ฐ์ด์ค๋ก ๊ตฌ์ฑ๋๋ค. ์คํ๋ง์ Advisor
๋ ํ๋์ ํฌ์ธํธ์ปท๊ณผ ํ๋์ ์ด๋๋ฐ์ด์ค ์กฐํฉ์ผ๋ก, ๊ฐ์ฅ ๋จ์ํ Aspect
๋ผ๊ณ ์๊ฐํ ์ ์๋ค.(Aspect>Advisor)
@AspectJ
-> Aspect
๋ฅผ ์๋ฐํด๋์ค, ๋ฉ์๋, ์ ๋
ธํ
์ด์
์ด์ฉํ์ฌ ์ ์ํ๋ ๋ฐฉ๋ฒ
<aop:aspectj-autoproxy>
์ค์ ์ฌ์ค@AspectJ
์ ๋ ธํ ์ด์ ์ ์กด์ฌํ์ง ์๋๋ค. @AspectJ ๋ฐฉ์์ ์ ์คํํธ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด XML ์ค์ ํ์ผ์ ์ ์์ ํ๊ทธ๋ฅผ ์ ์ธํด์ค์ผํจ ์ด ์ ์ธ์๋น์ผ๋ก ๋ฑ๋ก๋ ํด๋์ค
์ค์์ ํด๋์ค ๋ ๋ฒจ์@Aspect
์ ๋ ธํ ์ด์ ์ด ๋ถ์ ๊ฒ์๋ชจ๋ ์ ์คํํธ๋ก ์๋๋ฑ๋ก ํด์ค๋ค. ํต์ฌ์ด๋ค.AspectJ ๋ฐํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํด๋์คํจ์ค์ ์ถ๊ฐ
@Aspect @Configuration ์ฒ๋ผ ํด๋์ค์ ์ ์ธํ์ฌ ๋งํน. ์ด ํด๋์ค๊ฐ ์ด๋ค ํ๋์ ์ ์คํํธ ์์ ๋งํนํ๋ค. ๊ทธ๋ฆฌ๊ณ
Aspect๋ก ๋งํน๋ ํด๋์ค
๋ ๋น์ผ๋ก ๋ฑ๋ก๋์ด์ผ ํ๋ค.@Pointcut @Bean ์ฒ๋ผ ๋ฉ์๋์ ๋งํนํ๋ค.
๋งํน ๋ ๋ฉ์๋๋ ํ๋์ ํฌ์ธํธ์ปท
์ผ๋ก ์์ฉ. @Pointcut(ํํ์) ์ ํตํด ์ ํ ์๊ณ ๋ฆฌ์ฆ์ ์ง์ ํจ. ์ฌ๋ฌ๊ฐ์ ํฌ์ธํธ์ปท์ ์ ์ ํด๋๊ณ ํ์ฉ ํ ์ ์๋ค.Advice(@Before, @After, @AfterReturninig, @AfterThrowing, @Around) ์กฐ์ธํฌ์ธํธ์ ๋ฐ๋ฅธ 5๊ฐ์ง์ ์ด๋๋ฐ์ด์ค๋ฅผ ์ค์ ํ ์ ์๋ค. ํ๋ฒํ
POJOํด๋์ค
๋ก ๊ตฌํํ๋ฉด ๋จ
ํฌ์ธํธ์ปท ๋ฉ์๋์ ์ ๋
ธํ
์ด์
@Pointcut, ๋ฉ์๋ ์ด๋ฆ, ํ๋ผ๋ฏธํฐ๋ก ์ ์
๋ฉ์๋์ ๋ฆฌํดํ์
: ํญ์ voidํ
๋ฉ์๋์ ์ด๋ฆ : ํฌ์ธํธ์ปท์ ์ด๋ฆ
์ผ๋ก ์ฌ์ฉ ๋จ
ํฌ์ธํธ์ปท์ ๋ ๋ค๋ฅธ ํฌ์ธํธ์ปท์ด๋ ์ด๋๋ฐ์ด์ค์์ ํ์ฉ๋ ์ ์์ผ๋ฉฐ, ํฌ์ธํธ์ปท์ด ์ฐธ์กฐ ๋ ๋ ๋ฉ์๋์ด๋ฆ+ํ๋ผ๋ฏธํฐ
๊น์ง ํฌํจํ๋ค.
execution()
๊ฐ์ฅ ๋ํ์ . ์ ๊ทผ์ ํ์, ๋ฆฌํดํ์ , ํ์ , ๋ฉ์๋, ํ๋ผ๋ฏธํฐ ํ์ , ์์ธํ์ 6๊ฐ ->
๋ฆฌํดํ์ , ๋ฉ์๋, ํ๋ผ๋ฏธํฐ 3๊ฐ๋ ํ์
within()
ํ์ ๋ง. ๊ฐํธํ๊ฒ ์ฌ์ฉํด์ผ ํ ๋ ์ข์
. ํจํค์ง๊น์ง ์ ํ ๊ฐ๋ฅA.B.C.., A.B.C. ๋ฑ
bean() ๋น ์ด๋ฆ or ์์ด๋๋ฅผ ์ด์ฉ. ์์ผ๋์นด๋(*) ์ฌ์ฉ๊ฐ๋ฅ.
AspectJ์์ ์ฐจ์ฉํ๊ฒ ์๋๋ฉฐ, Spring AOP ์ ์ฉ์ง์์.
this, target, args,
@target, @within, @args, @annotation
&&, ||, ! ๋ ผ๋ฆฌ์ฐ์ฐ์๋ก ์กฐํฉ ๊ฐ๋ฅ.
์ด๋๋ฐ์ด์ค ๋ฉ์๋์ ์ ๋
ธํ
์ด์
5๊ฐ์ง์ ์ข ๋ฅ๊ฐ ์๋ค
์ ์, ๊ฒ์ฌ์์ธ์ฒ๋ฆฌ : Around -> Before -> ํ๊ฒ ๋ฉ์๋ -> Around -> After -> After Returning ์์ธ : Around -> Before -> ํ๊ฒ ๋ฉ์๋ -> After -> After Throwing
@Around ํฌ์ธํธ์ปท์์ ์ ํ ์ฒ๋ฆฌ. ๋ค์ํ ์กฐ์์ด ๊ฐ๋ฅํ๋, ๊ทธ๋งํผ ์์ฑํ๊ธฐ ๋ณต์ก ๋๋จธ์ง ์ด๋๋ฐ์ด์ค๋ฅผ ๊ฒํ ํ๊ณ , ์์ ๊ฒฝ์ฐ์๋ง ์ตํ์ ์ ํ์ด ๋ฐ๋์ง.
ProceedingJoinPoint
๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ ์ธํ์ฌ ํ๊ฒ๋ฉ์๋์ ๋ํ ์ ๋ณด๋ฅผ ์ทจ๋ ํ ์ ์๋ค. proceed ๋ฉ์๋๋ฅผ ์คํํ ๋, ๋งค๊ฐ๋ณ์์ ์ ๋ฌ์ธ์์ ๋ฐฐ์ด์ ๋๊ธฐ๋ฉด ํ๊ฒ๋ฉ์๋ ์คํ์์ ์ ๋ณ๊ฒฝ๋ ์ธ์๊ฐ์ ๋๊ธธ ์ ์๋ค.@Before ํ๊ฒ๋ฉ์๋ ์คํ์ ์ ์คํ๋๋ ์ด๋๋ฐ์ด์ค๋ค.
JoinPoint ์ธํฐํ์ด์ค
๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ ์ธํ์ฌ ํ๊ฒ ๋ฉ์๋์ ์ ๋ณด๋ฅผ ์ทจ๋ ํ ์ ์์ง๋ง, ์คํ์ ํ ์ ์๋ค(proceed()).@AfterReturninig
์ ์์ข ๋ฃ
๋ ์ดํ์ ํธ์ถ ๋๊ธฐ ๋๋ฌธ์ ๋ฉ์๋์ ๋ฆฌํด ๊ฐ์ ์ฐธ์กฐ ํ ์ ์์.๋ฆฌํด ๊ฐ ์์ฒด
๋ฅผ ๋ฐ๊ฟ ์๋ ์๋ค. ๊ทธ๋ฌ๋ ์ฐธ์กฐ ๊ฐ์ด๋ฉด ๋ณ๊ฒฝ ๊ฐ๋ฅ. ๋ฆฌํด ์ฐธ์กฐ๊ฐ ํ์์๋ค๋ฉด ๊ตณ์ด ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ธํ ํ์๋ ์๋ค.@AfterThrowing ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ์คํ๋๋ ์ด๋๋ฐ์ด์ค.
์์ธ ํ์ ๊ณผ ํ๋ผ๋ฏธํฐ ๋ช ์ด ์ผ์นํด์ผ ์คํ๋๋ค.
ํ์ ์ ์์ํ์ ๊ณผ ์ผ์นํ๋ฉด ๋๋ค@After ์ ์์ข ๋ฃ or ์์ธ๊ฐ ์ฒ๋ฆฌ๋๋ ์คํ๋จ.
finally ๊ฐ์ ์กด์ฌ
ํ๋ผ๋ฏธํฐ ์ ์ธ๊ณผ ๋ฐ์ธ๋ฉ
JoinPoint
, ProceedingJoinPoint
๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ
ProceedingJoinPoint๋ JoinPoint์ ๊ตฌํ์ฒด๋ก, ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ๋ ๋ด๊ณ ์๋ค.
ํ๊ฒ ๋ฉ์๋ ์คํ
, ํ๋ผ๋ฏธํฐ ๊ฐ, ๋ฆฌํด๊ฐ ๋ณ๊ฒฝ ๋ฑ ๋ค์ํ ์กฐ์์ด ๊ฐ๋ฅํ๋ค.
5.2 AspectJ์ @Configurable
AspectJ๋ ์คํ๋ง AOP์ ๋ฌ๋ฆฌ ํ๋ก์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ํด๋์ค์ ๋ฐ์ดํธ์ฝ๋
๋ฅผ ์กฐ์ํ๋ค.
์ด๋ ๊ฒ ๋ณต์กํ ์์
์ ์ฌ์ฉํ๋ ์ด์ ๋ ํ๋ก์๋ฐฉ์์ผ๋ก๋ ์ด๋๋ฐ์ด์ค๋ฅผ ์ ์ฉ ํ ์ ์๋ ์กฐ์ธํฌ์ธํธ์ ํฌ์ธํธ์ปท ์ง์์๋ฅผ ์ง์ํ๊ธฐ ์ํด์๋ค.
์ฌ๊ธฐ์์ AspectJ ๊ฐ์ ๊ฒฝ์ฐ, AspectJ์ ์กฐ์ธํฌ์ธํธ๋ ํ๋์ ์ฝ๊ธฐ,์ฐ๊ธฐ ์คํํฑ์ด๊ธฐํ, ์ธ์คํด์ค์์ฑ, ์ธ์คํด์ค์ด๊ธฐํ ๋ฑ ์คํ๋ง์์ ์ ๊ณตํ๋ ๊ฒ๋ณด๋ค ํจ์ฌํจ์ฌ ๋ง์ ๊ฒ์ ์ง์ํ๋ค.
๊ทธ๋ฌ๋ ๋๋ถ๋ถ 99.9%๋ ์คํ๋ง์ ํ๋ก์ ๋ฐฉ์์ AOP๋ก๋ ์ถฉ๋ถํ ๊ฒ์ด๋ค. (๋ฉ์๋ ๊ธฐ์ค์ ํฌ์ธํธ์ปท)
๋น์ด ์๋ ์ค๋ธ์ ํธ์ DI ์ ์ฉํ๊ธฐ
DI๋ฅผ ์ ์ฉํ๋ ค๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์คํ๋ง์ปจํ ์ด๋์ Bean์ผ๋ก ๋ฑ๋ก์ด ๋์ด์ผํ๋ค. User์ ๊ฐ์ ์ค๋ธ์ ํธ๋ ํ์์์ ๋งค๋ฒ ์์ฑ๋์ด์ผํ๋๋ฐ.. ์ด๋ ๋น์ฆ๋์ค ๋ก์ง๋ ๋ด๊ฒจ์๋ค๋ฉด,...? ์ด๋ฐ ์ค๊ณ๋ฅผ DDD ๊ด์ ์์ ํด์์ ํด์ผํ๋ค. ์ด๋ฐ ์ค๋ธ์ ํธ๋ DI๋ฐ์ ์ ์๊ฒํ๋ ๋ฐฉ๋ฒ.. AOP๊ฐ ๊ทธ๋ ๊ฒ ๊ฐ๋ฅํ๋๋ก ๋ฐฉ์์ ์ ๋๋ฅผ ํ ์ ์๋๋ฐ, ์คํ๋ง AOP๋ ์กฐ์ธํฌ์ธํธ์ ์ค๋ธ์ ํธ ์์ฑ๊น์ง ๊ด์ฌ๋ฅผ ํ ์๋ ์๋ค... ๊ทธ๋ฌ๋ AspectJ AOP๋ ๊ฐ๋ฅํ๋ค... ์ด๋ฐ ๊ฒฝ์ฐ AspectJ AOP๊ฐ ํ์ํ ๊ฒ์ด๋ค.
์คํ๋ง์์ ์ ๊ณตํ๋ AspectJ -> DependencyInjectionAspect
(ํ์ผํ์ฅ์ .aj)
DI์ ์คํํธ
@Configurable
๋ถ์ ํด๋์ค๋ฅผ ์์นญํด์ ์ ์คํํธ๋ฅผ ์ ์ฉํ๋ค.
DI ์ค์ ๋ฐฉ๋ฒ์ 3๊ฐ์ง๊ฐ ์๋ค.
<bean>์ค์
User์ ๋น์ผ๋ก ๋ฑ๋กํ ์ด์ ๋ DI ๋ฐ๊ธฐ์ํด์๊ฐ ์๋๋ค.
property์์ setter ์ฃผ์ ์ ๋ฐ๋ 2๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋น์ผ๋ก DI ๋ฐ๊ธฐ ์ํจ.
DI ์ ์คํํธ์์๋ ๋น์ ์ ๋ณด๋ฅผ ์ฝ์ ์ ์๋ค๋ ์ ๋ ์๋ค.
์๋์์ด์ด๋ง
๋น์ค์ ์ ํ์ ์์. ์์ ์ ๋ฉ์๋์ ๋ํด DI๋ฅผ ์๋ํ๋ค๋ ์ ์ด๋ค.
์ ๋ ธํ ์ด์ ์์กด๊ด๊ณ ์ค์
์ด๋ ๊ฒ ์ค์ ํ์ผ๋ฉด... ์ด์ DI์ ์คํํธ ์ ์ฉ์ ํด์ผํ๋ค.
-> ๋ก๋ํ์ ์๋ฒ์ ์๋ฐ ์์ด์ ํธ AspectJ -> ํด๋์ค ๋ก๋ฉ ์์ -> ๋ฐ์ดํธ์ฝ๋ ์กฐ์ -> ๋ก๋ํ์์๋ฒ ์ ์ฉ ํ์
JVM์ javaagent ์ต์
์ ์ฉ -> JVM๋ ๋ฒจ ์ ์ฉ ํ์
๋ผ์ด๋ธ๋ฌ๋ฆฌ : aspectjweaver.jar
-> ์๋ฐ ์์ด์ ํธ๋ก ์ง์ , META-INF ๋ฐ์ aop.xml ์ค์
-> AspectJ ๋ก๋ํ์ ์๋ฒ๋ ์์ผ๋, ์คํ๋ง์ด ์ง์ ์ ๊ณตํ๋ ๋ก๋ํ์์๋ฒ ๋ฐฉ์์ฌ์ฉ(spring-instrument-๋ฒ์ ์ ๋ณด)
ํด๋์คํจ์ค ์ค์ ์ด ์๋ JVM ์ต์
์ง์ ํ์(-javaagent:lib/org.springframework.instrument-๋ฒ์ .jar
<context:load-time-weaver/>
์ค์ ํ์
META-INF ํ์ผ ๋ฐ์ aop.xml์ด ์๋ค๋ฉด,
<context:load-time-weaver aspect-weaving="on"/>
์ค์ ํ์
์ด์ DI ์ ์คํํธ ๋ฑ๋ก ์ฐจ๋ก
<context:spring-configured/>
์ค์ ์ด ํ์ํ๋ค
5.3 ๋ก๋ํ์ ์๋ฒ(LTW)
LTW ๊ธฐ๋ฅ
@Configurable ์ง์
<context:spring-configured/>
๋ก ๋ฑ๋กํ DI ์ ์คํํธ ๋์ + AspectJ ๋ก๋ํ์ ์๋ฒ ๊ธฐ๋ฅ ๋์ฒด๊ฐ๋ฅAspectJ AOP ๊ธฐ๋ฅ ์ง์
<tx:annotation-driven mode="aspectJ"/>
-> ํธ๋์ญ์ AOP์ ๋ชจ๋๋ฅผ AspectJ๋ก ์ค์ ํ ๋ ์ญ์ ๋ก๋ํ์์๋ฒ๊ฐ ํ์ (Spring AOP๋ ๋ฐํ์์๋น์ด๋ค.)JPA ์ฌ์ฉ์ JPA๋ ๊ตฌํ ์ ํ์ ๋ฐ๋ผ์ ๋๋ถ๋ถ
๋ก๋ํ์ ์๋ฒ๋ฅผ ์ฌ์ฉํ ๋ฐ์ดํธ์ฝ๋ ์กฐ์์ด ํ์
POJO๋ก ๋ง๋ ๋๋ฉ์ธ์ค๋ธ์ ํธ์ ์ง์ฐ๋ก๋ฉ, ๋ณ๊ฒฝํญ๋ชฉ๊ฐ์, ๊ทธ๋ฃน์กฐํ, ์กฐ์ธ์ ์ด์ฉํ ๋ก๋ฉ ๋ฐ ์ต์ ํ ๊ธฐ๋ฅ ์ ์ฉ -> ๋ฐ์ดํธ์ฝ๋ ์กฐ์ํ์ -> JPA๋ ๊ฐ ๊ตฌํ ์ ํ๋ง๋ค์ ์ฉLTW๋ฅผ ์ ๊ณต
๋จ์ 1. AspectJ์ JPA์ LTW๋ฅผ ๋ชจ๋ ์ ์ฉํด์ผ ํ๋ค๋ฉด... ๋ฌธ์ JVM์ ์๋ฐ์์ด์ ํธ ์ต์
ํ๋ฒ์ ํ๊ฐ์ง๋ง ์ ์ฉ ๊ฐ๋ฅ
JVM์ ํตํด ๋ก๋ฉ๋๋ ๋ชจ๋ ํด๋์ค๋ฅผ ์ ์ ์กฐ์ฌ, ํด๋์ค ๋ฐ์ดํธ ์ฝ๋ ์กฐ์๋์์ผ๋ก ์ผ์ -> ๋ถํ๋ฅผ ์ผ์ผํค๊ธฐ ๋๋ฌธ์, ์๋ฒ์ ์ ์ฉํ๊ธฐ ๋ถ๋ด
Spring์ด ์ ๊ณตํ๋ LTW๋ ๋๊ฐ์ง ๋ฌธ์ ํด๊ฒฐ
Spring์ด ์ ๊ณตํ๋ LTW๋ ๋๊ฐ์ง ๋ฌธ์ ํด๊ฒฐ
JPA ->
LocalContainerEntityManagerFactoryBean
์ด์ฉ -><context:load-time-weaver/>
์ถ๊ฐ ๋ง์ผ๋ก ์คํ๋ง์ LTW๊ฐ ์๋์ผ๋ก JPA LTW๋ก ์ฌ์ฉ๋จ๋์์ AspectJ LTW๋ก๋ ๋์ํจ
์คํ๋ง LTW -> ์๋ฐ์์ด์ ํธ์ ์ข ์์ ์ด์ง ์์. LTW ํ๊ทธ ์ค์ ์
ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ํ๊ฒฝ์ ๋ณด๋ฅผ ๋ถ์ํด์ ์ ํฉํ LTW๋ฅผ ๋ฑ๋ก
ํจ
WAS LTW ์ ๊ณต
WAS ์ ์ฉ LTW ์ ๊ณต -> WebLogic, OC4J, GlassFish, JBossAS
๊ทธ์ธ JVM ์์ด์ ํธ -> ์คํ๋งํ์ฉ
ํด๋์ค๋ก๋ -> ์คํ๋ง์ด ํฐ์บฃ์๋ ์ ์ฉ ํด๋์ค๋ก๋ ์ ๊ณต
(TomcatInstrumentableClassLoader)
-> Contextํ์<Loader loaderClass=ํด๋์ค>์ ์ค์
5.4 ์คํ๋ง 3.1์ AOP LTW
3.1๋ถํฐ ์ ์ฉ ์ ๋
ธํ
์ด์
์ถ๊ฐ
@EnableAspectJAutoProxy
@Aspect๋ก ์ ์คํํธ๋ฅผ ์ ์ํ ์ ์๊ฒ ํด์ฃผ๋
@AspectJ AOP ์ปจํ ์ด๋
์ธํ๋ผ๋น์ ๋ฑ๋กํด์ค๋ค.<aop:apsectj-autoproxy>
์ ์๋ฐ ๋ฒ์ ```java
@Aspect
public class MyAspect{}
@Configuration // -> ์ปจํ ์คํธ ์ญํ @EnableAspectAutoProxy // -> @Aspect AOP ์ปจํ ์ด๋์ญํ ๋ด๋น public class AppConfig{
}
Last updated
Was this helpful?