/spring-advanced

๐ŸŒฟ ์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ณ ๊ธ‰ํŽธ ๐ŸŒฟ

Primary LanguageJava

์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ ๊ณ ๊ธ‰ํŽธ

ํฌ์ธํŠธ์ปท ์ง€์‹œ์ž

ํฌ์ธํŠธ์ปท ํ‘œํ˜„์‹์€ execution ๊ฐ™์€ ํฌ์ธํŠธ์ปท ์ง€์‹œ์ž๋กœ ์‹œ์ž‘ํ•œ๋‹ค. ์ค„์—ฌ์„œ PCD ๋ผ ํ•œ๋‹ค.

  • ํฌ์ธํŠธ์ปท ์ง€์‹œ์ž์˜ ์ข…๋ฅ˜
    • execution: ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ์กฐ์ธ ํฌ์ธํŠธ๋ฅผ ๋งค์นญํ•œ๋‹ค. ์Šคํ”„๋ง AOP ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ , ๊ธฐ๋Šฅ๋„ ๋ณต์žกํ•˜๋‹ค.
    • within: ํŠน์ • ํƒ€์ž… ๋‚ด์˜ ์กฐ์ธ ํฌ์ธํŠธ๋ฅผ ๋งค์นญํ•œ๋‹ค.
    • args: ์ธ์ž๊ฐ€ ์ฃผ์–ธ์ง„ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค์ธ ์กฐ์ธ ํฌ์ธํŠธ
    • this: ์Šคํ”„๋ง ๋นˆ ๊ฐ์ฒด(์Šคํ”„๋ง AOP ํ”„๋ก์‹œ)๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์กฐ์ธ ํฌ์ธํŠธ
    • target: Target ๊ฐ์ฒด(์Šคํ”„๋ง AOP ํ”„๋ก์‹œ๊ฐ€ ๊ฐ€๋ฅดํ‚ค๋Š” ์‹ค์ œ ๋Œ€์ƒ)๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์กฐ์ธ ํฌ์ธํŠธ
    • @target: ์‹คํ–‰ ๊ฐ์ฒด์˜ ํด๋ž˜์Šค์— ์ฃผ์–ด์ง„ ํƒ€์ž…์˜ ์• ๋…ธํ…Œ์ด์…˜์ด ์žˆ๋Š” ์กฐ์ธ ํฌ์ธํŠธ
    • @within: ์ฃผ์–ด์ง„ ์—๋…ธํ…Œ์ด์…˜์ด ์žˆ๋Š” ํƒ€์ž… ๋‚ด ์กฐ์ธ ํฌ์ธํŠธ
    • @annotation: ๋ฉ”์„œ๋“œ๊ฐ€ ์ฃผ์–ธ์ง„ ์—๋…ธํ…Œ์ด์…˜์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์กฐ์ธ ํฌ์ธํŠธ๋ฅผ ๋งค์นญ
    • @args: ์ „๋‹ฌ๋œ ์‹ค์ œ ์ธ์ˆ˜์˜ ๋Ÿฐํƒ€์ž„ ํƒ€์ž…์ด ์ฃผ์–ด์ง„ ํƒ€์ž…์˜ ์—๋…ธํ…Œ์ด์…˜์„ ๊ฐ–๋Š” ์กฐ์ธ ํฌ์ธํŠธ
    • bean: ์Šคํ”„๋ง ์ „์šฉ ํฌ์ธํŠธ์ปท ์ง€์‹œ์ž, ์ง„์˜ ์ด๋ฆ„์œผ๋กœ ํฌ์ธํŠธ์ปท์„ ์ง€์ •ํ•œ๋‹ค.

์Šคํ”„๋ง AOP ์ฃผ์˜์‚ฌํ•ญ

ํ”„๋ก์‹œ์™€ ๋‚ด๋ถ€ ํ˜ธ์ถœ ๋ฌธ์ œ

์Šคํ”„๋ง์€ ํ”„๋ก์‹œ ๋ฐฉ์‹์˜ AOP ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
๋”ฐ๋ผ์„œ AOP ๋ฅผ ์ ์šฉํ•˜๋ ค๋ฉด ํ•ญ์ƒ ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด์„œ ๋Œ€์ƒ ๊ฐ์ฒด(Target)์„ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•ด์•ผ ํ”„๋ก์‹œ์—์„œ ๋จผ์ € ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์ดํ›„์— ๋Œ€์ƒ ๊ฐ์ฒด๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

๋Œ€์ƒ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€์—์„œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•˜๋ฉด ํ”„๋ก์‹œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋Œ€์ƒ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค!
์ž๋ฐ” ์–ธ์–ด์„ธ์–ด ๋ฉ”์„œ๋“œ ์•ž์— ๋ณ„๋„์˜ ์ฐธ์กฐ๊ฐ€ ์—†์œผ๋ฉด this ๋ผ๋Š” ๋œป์œผ๋กœ ์ž๊ธฐ ์ž์‹ ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
๊ฒฐ๊ณผ์ ์œผ๋กœ ์ž์‹ ์˜ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ this ๋Š” ์‹ค์ œ ๋Œ€์ƒ ๊ฐ์ฒด(target) ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋œปํ•œ๋‹ค.
์ด๋Ÿฌํ•œ ๋‚ด๋ถ€ ํ˜ธ์ถœ์€ ํ”„๋ก์‹œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

  • ์ž๊ธฐ ์ž์‹ ์„ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… ๋ฐ›๋Š” ๊ฒƒ
  • ์ง€์—ฐ ์กฐํšŒ (ObjectProvider(Provider), ApplicationContext ์‚ฌ์šฉ)
  • ๋‚ด๋ถ€ ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ (๊ถŒ์žฅ)

ํƒ€์ž… ์บ์ŠคํŒ…

์Šคํ”„๋ง์ด ํ”„๋ก์‹œ๋ฅผ ๋งŒ๋“ค๋•Œ ์ œ๊ณตํ•˜๋Š” ProxyFactory ์— proxyTargetClass ์˜ต์…˜์— ๋”ฐ๋ผ ๋‘˜์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด์„œ ํ”„๋ก์‹œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

  • proxyTargetClass=false: JDK ๋™์  ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ ํ”„๋ก์‹œ ์ƒ์„ฑ
  • proxyTargetClass=true: CGLIB๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌ์ฒด ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ํ”„๋ก์‹œ ์ƒ์„ฑ
  • ์ฐธ๊ณ ๋กœ ์˜ต์…˜๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—†์œผ๋ฉด JDK ๋™์  ํ”„๋ก์‹œ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ CGLIB๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ํ”„๋ก์‹œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” JDK ๋™์  ํ”„๋ก์‹œ๋Š” ๊ตฌ์ฒด ํด๋ž˜์Šค์— ํƒ€์ž… ์บ์ŠคํŒ…์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค.

์˜์กด๊ด€๊ณ„ ์ฃผ์ž…

์‹ค์ œ๋กœ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์œผ๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์„ ๋ฐ›๋Š” ๊ฒƒ์ด ๋งž๋‹ค.
DI์˜ ์žฅ์ ์ด ๋ฌด์—‡์ธ๊ฐ€? DI ๋ฐ›๋Š” ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ ์—†์ด ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์˜์กด๊ด€๊ณ„๋ฅผ ์ฃผ์ž… ๋ฐ›์•„์•ผ ํ•œ๋‹ค.
๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํ…Œ์ŠคํŠธ, ๋˜๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ด์œ ๋กœ AOP ํ”„๋ก์‹œ๊ฐ€ ์ ์šฉ๋œ ๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… ๋ฐ›์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.
์ด๋•Œ๋Š” CGLIB ๋ฅผ ํ†ตํ•ด ๊ตฌ์ฒด ํด๋ž˜์Šค ๊ธฐ๋ฐ˜์œผ๋กœ AOP ํ”„๋ก์‹œ๋ฅผ ์ ์š”ํ•˜๋ฉด ๋œ๋‹ค.

CGLIB ๊ตฌ์ฒด ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ํ”„๋ก์‹œ ๋ฌธ์ œ์ 

  • ๋Œ€์ƒ ํด๋ ˆ์Šค์— ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ํ•„์ˆ˜
  • ์ƒ์„ฑ์ž 2๋ฒˆ ํ˜ธ์ถœ ๋ฌธ์ œ
  • final ํ‚ค์›Œ๋“œ ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€