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 ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋Š” ์—†์œผ๋‚˜, ์ž๋™ํ”„๋ก์‹œ์— ์˜ํ•ด ๊ทธ ํƒ€๊ฒŸ์ด ํ”„๋ก์‹œ๋นˆ์œผ๋กœ ๊ฐ์ถฐ์ง€๊ฒŒ ๋˜๋ฉด ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™” ๊ณผ์ •์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

ํ”„๋ก์‹œ

  1. ํ”„๋ก์‹œ ์ƒ์„ฑ์„ํ•  ๋•Œ, ํƒ€๊นƒ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ํ”„๋ก์‹œ๋Š” ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์„ ๊ฐ–๊ฒŒ ๋˜์ง€๋งŒ, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ  ์žˆ๋‹ค๋ฉด CGLib๋ฅผ ์ด์šฉํ•œ ํด๋ž˜์Šค ํ”„๋ก์‹œ๋ฅผ ๋งŒ๋“ ๋‹ค.

  2. ๊ฐ•์ œ๋กœ ํด๋ž˜์Šค ํ”„๋ก์‹œ๋ฅผ ๋งŒ๋“ค๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. (1๋ฒˆ์—์„œ ํ›„์ž) ํด๋ž˜์Šค ํ”„๋ก์‹œ๋ฅผ ๊ฐ•์ œ ํ•˜๋ฉด -> ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋”๋ผ๋„ ๋ฌด์‹œํ•˜๊ณ  ํด๋ž˜์Šค๋ฅผ ํ”„๋ก์‹œ๋กœ ๋งŒ๋“ ๋‹ค -> aop ์Šคํ‚ค์•„ ์‚ฌ์šฉ์‹œ aop:config์—์„œ proxy-target-class="true"๋กœ ์„ค์ •์„ ํ•˜๋ฉด ๋œ๋‹ค.

    <aop:config proxy-target-class="true">
    ...
    </aop:config>

    ์• ๋…ธํ…Œ์ด์…˜ AOP ๋ฐฉ์‹์˜ @Transactional -> <tx:annotation-driven>์—๋„ proxy-target-class="true"๋ฅผ ์ฃผ๋ฉด ์ธํ„ฐํŽ˜์ด์Šค์˜ ์กด์žฌ์™€ ์ƒ๊ด€์—†์ด ํด๋ž˜์Šค ํ”„๋ก์‹œ๋ฅผ ์ƒ์„ฑ. ์ด๋•Œ ํ”„๋ก์‹œ์˜ ํƒ€์ž…์€ ํƒ€๊นƒ์˜ค๋ธŒ์ ํŠธ์˜ ํƒ€์ž…๊ณผ ๋™์ผํ•˜๋‹ค

@AspectJ AOP

Aspect๋ž€, OOP์˜ ํด๋ž˜์Šค์™€ ๋น„์Šทํ•œ ๊ฐœ๋…์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๋‹ค. ๊ทธ ์ž์ฒด๋กœ ํ•ต์‹ฌ๊ธฐ๋Šฅ์€ ์•„๋‹ˆ์ง€๋งŒ ๋งŽ์€ ์˜ค๋ธŒ์ ํŠธ์— ๊ฑธ์ณ์„œ ํ•„์š”ํ•œ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ์ถ”์ƒํ™” ํ•ด๋†“์€ ๊ฒƒ. Aspect๋Š” ํ•˜๋‚˜์ด์ƒ์˜ ํฌ์ธํŠธ์ปท๊ณผ ์–ด๋“œ๋ฐ”์ด์Šค๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ์Šคํ”„๋ง์˜ Advisor๋Š” ํ•˜๋‚˜์˜ ํฌ์ธํŠธ์ปท๊ณผ ํ•˜๋‚˜์˜ ์–ด๋“œ๋ฐ”์ด์Šค ์กฐํ•ฉ์œผ๋กœ, ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ Aspect๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.(Aspect>Advisor) @AspectJ -> Aspect๋ฅผ ์ž๋ฐ”ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ, ์• ๋…ธํ…Œ์ด์…˜ ์ด์šฉํ•˜์—ฌ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•

  1. <aop:aspectj-autoproxy> ์„ค์ • ์‚ฌ์‹ค @AspectJ ์• ๋…ธํ…Œ์ด์…˜์€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. @AspectJ ๋ฐฉ์‹์˜ ์• ์ŠคํŽ™ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด XML ์„ค์ •ํŒŒ์ผ์— ์ € ์œ„์— ํƒœ๊ทธ๋ฅผ ์„ ์–ธํ•ด์ค˜์•ผํ•จ ์ด ์„ ์–ธ์€ ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋œ ํด๋ž˜์Šค ์ค‘์—์„œ ํด๋ž˜์Šค ๋ ˆ๋ฒจ์— @Aspect ์• ๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ๊ฒƒ์„๋ชจ๋‘ ์• ์ŠคํŽ™ํŠธ๋กœ ์ž๋™๋“ฑ๋ก ํ•ด์ค€๋‹ค. ํ•ต์‹ฌ์ด๋‹ค.

  2. AspectJ ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํด๋ž˜์ŠคํŒจ์Šค์— ์ถ”๊ฐ€

  3. @Aspect @Configuration ์ฒ˜๋Ÿผ ํด๋ž˜์Šค์— ์„ ์–ธํ•˜์—ฌ ๋งˆํ‚น. ์ด ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ค ํ•˜๋‚˜์˜ ์• ์ŠคํŽ™ํŠธ ์ž„์„ ๋งˆํ‚นํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Aspect๋กœ ๋งˆํ‚น๋œ ํด๋ž˜์Šค๋Š” ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜์–ด์•ผ ํ•œ๋‹ค.

  4. @Pointcut @Bean ์ฒ˜๋Ÿผ ๋ฉ”์†Œ๋“œ์— ๋งˆํ‚นํ•œ๋‹ค. ๋งˆํ‚น ๋œ ๋ฉ”์„œ๋“œ๋Š” ํ•˜๋‚˜์˜ ํฌ์ธํŠธ์ปท์œผ๋กœ ์ž‘์šฉ. @Pointcut(ํ‘œํ˜„์‹) ์„ ํ†ตํ•ด ์„ ํƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ง€์ •ํ•จ. ์—ฌ๋Ÿฌ๊ฐœ์˜ ํฌ์ธํŠธ์ปท์„ ์„ ์ •ํ•ด๋†“๊ณ  ํ™œ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  5. Advice(@Before, @After, @AfterReturninig, @AfterThrowing, @Around) ์กฐ์ธํฌ์ธํŠธ์— ๋”ฐ๋ฅธ 5๊ฐ€์ง€์˜ ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์„ค์ • ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ‰๋ฒ”ํ•œ POJOํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋จ

ํฌ์ธํŠธ์ปท ๋ฉ”์„œ๋“œ์™€ ์• ๋…ธํ…Œ์ด์…˜

@Pointcut, ๋ฉ”์„œ๋“œ ์ด๋ฆ„, ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ •์˜ ๋ฉ”์„œ๋“œ์˜ ๋ฆฌํ„ดํƒ€์ž… : ํ•ญ์ƒ voidํ˜• ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„ : ํฌ์ธํŠธ์ปท์˜ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ ๋จ

@Pointcut("execution(* sayHello(..))")
private void hello();

ํฌ์ธํŠธ์ปท์€ ๋˜ ๋‹ค๋ฅธ ํฌ์ธํŠธ์ปท์ด๋‚˜ ์–ด๋“œ๋ฐ”์ด์Šค์—์„œ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํฌ์ธํŠธ์ปท์ด ์ฐธ์กฐ ๋  ๋•Œ ๋ฉ”์„œ๋“œ์ด๋ฆ„+ํŒŒ๋ผ๋ฏธํ„ฐ๊นŒ์ง€ ํฌํ•จํ•œ๋‹ค.

  • 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๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  1. <bean>์„ค์ •

    User์„ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•œ ์ด์œ ๋Š” DI ๋ฐ›๊ธฐ์œ„ํ•ด์„œ๊ฐ€ ์•„๋‹ˆ๋‹ค.

    property์—์„œ setter ์ฃผ์ž…์„ ๋ฐ›๋Š” 2๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ๋นˆ์œผ๋กœ DI ๋ฐ›๊ธฐ ์œ„ํ•จ.

    DI ์• ์ŠคํŽ™ํŠธ์—์„œ๋„ ๋นˆ์˜ ์ •๋ณด๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ๋„ ์žˆ๋‹ค.

    <bean class="A.B.C...User" abstract="true">
      <property name="userPolicyDao" ref="userPolicyDao"/>
      <property name="emailService" ref="emailService"/>
    </bean>
  2. ์ž๋™์™€์ด์–ด๋ง

    ๋นˆ์„ค์ •์€ ํ•„์š” ์—†์Œ. ์ˆ˜์ •์ž ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด DI๋ฅผ ์‹œ๋„ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

       @Configurable(autowire=Autowire.BY_NAME)
       public class User{}
  3. ์• ๋…ธํ…Œ์ด์…˜ ์˜์กด๊ด€๊ณ„ ์„ค์ •

์ด๋ ‡๊ฒŒ ์„ค์ •ํ–ˆ์œผ๋ฉด... ์ด์ œ 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 ๊ธฐ๋Šฅ

  1. @Configurable ์ง€์› <context:spring-configured/>๋กœ ๋“ฑ๋กํ•œ DI ์• ์ŠคํŽ™ํŠธ ๋™์ž‘ + AspectJ ๋กœ๋“œํƒ€์ž„ ์œ„๋ฒ„ ๊ธฐ๋Šฅ ๋Œ€์ฒด๊ฐ€๋Šฅ

  2. AspectJ AOP ๊ธฐ๋Šฅ ์ง€์› <tx:annotation-driven mode="aspectJ"/> -> ํŠธ๋žœ์žญ์…˜ AOP์˜ ๋ชจ๋“œ๋ฅผ AspectJ๋กœ ์„ค์ •ํ•  ๋•Œ ์—ญ์‹œ ๋กœ๋“œํƒ€์ž„์œ„๋ฒ„๊ฐ€ ํ•„์š” (Spring AOP๋Š” ๋Ÿฐํƒ€์ž„์œ„๋น™์ด๋‹ค.)

  3. JPA ์‚ฌ์šฉ์‹œ JPA๋Š” ๊ตฌํ˜„ ์ œํ’ˆ์— ๋”ฐ๋ผ์„œ ๋Œ€๋ถ€๋ถ„ ๋กœ๋“œํƒ€์ž„ ์œ„๋ฒ„๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐ”์ดํŠธ์ฝ”๋“œ ์กฐ์ž‘์ด ํ•„์š” POJO๋กœ ๋งŒ๋“  ๋„๋ฉ”์ธ์˜ค๋ธŒ์ ํŠธ์— ์ง€์—ฐ๋กœ๋”ฉ, ๋ณ€๊ฒฝํ•ญ๋ชฉ๊ฐ์‹œ, ๊ทธ๋ฃน์กฐํšŒ, ์กฐ์ธ์„ ์ด์šฉํ•œ ๋กœ๋”ฉ ๋ฐ ์ตœ์ ํ™” ๊ธฐ๋Šฅ ์ ์šฉ -> ๋ฐ”์ดํŠธ์ฝ”๋“œ ์กฐ์ž‘ํ•„์š” -> JPA๋Š” ๊ฐ ๊ตฌํ˜„ ์ œํ’ˆ๋งˆ๋‹ค ์ „์šฉLTW๋ฅผ ์ œ๊ณต

๋‹จ์  1. AspectJ์™€ JPA์˜ LTW๋ฅผ ๋ชจ๋‘ ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด... ๋ฌธ์ œ JVM์˜ ์ž๋ฐ”์—์ด์ „ํŠธ ์˜ต์…˜ ํ•œ๋ฒˆ์— ํ•œ๊ฐ€์ง€๋งŒ ์ ์šฉ ๊ฐ€๋Šฅ

  1. JVM์„ ํ†ตํ•ด ๋กœ๋”ฉ๋˜๋Š” ๋ชจ๋“  ํด๋ž˜์Šค๋ฅผ ์ „์ˆ˜ ์กฐ์‚ฌ, ํด๋ž˜์Šค ๋ฐ”์ดํŠธ ์ฝ”๋“œ ์กฐ์ž‘๋Œ€์ƒ์œผ๋กœ ์‚ผ์Œ -> ๋ถ€ํ•˜๋ฅผ ์ผ์œผํ‚ค๊ธฐ ๋–„๋ฌธ์—, ์„œ๋ฒ„์— ์ ์šฉํ•˜๊ธฐ ๋ถ€๋‹ด

Spring์ด ์ œ๊ณตํ•˜๋Š” LTW๋Š” ๋‘๊ฐ€์ง€ ๋ฌธ์ œ ํ•ด๊ฒฐ

  1. JPA -> LocalContainerEntityManagerFactoryBean ์ด์šฉ -> <context:load-time-weaver/> ์ถ”๊ฐ€ ๋งŒ์œผ๋กœ ์Šคํ”„๋ง์˜ LTW๊ฐ€ ์ž๋™์œผ๋กœ JPA LTW๋กœ ์‚ฌ์šฉ๋จ ๋™์‹œ์— AspectJ LTW๋กœ๋„ ๋™์ž‘ํ•จ

  2. ์Šคํ”„๋ง 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{

@Bean // @Component๋กœ ํ•˜๊ณ  ์Šค์บ๋‹์„ ํ†ตํ•ด ๋‹ค๋ฅธ ๊ณณ์—์„œ DI ๊ฐ€๋Šฅ
MyAspect myAspect(){
  return new MyAspect();  // Aspect ๋ฐ˜ํ™˜
}

}

- `@EnableLoadTimeWeaving`  
  XML์˜ `<context:load-time-weaver/>` ์ฒ˜๋Ÿผ ํ™˜๊ฒฝ์— ๋งž๋Š” LTW ๋“ฑ๋กํ•ด์ฃผ๋Š” ์• ๋…ธํ…Œ์ด์…˜  
  ```java
  @Configuration
  @EnableLoadTimeWeaving
  public class AppConfig{}

Last updated