Spring AOP - Dynamic Proxy vs CGLIB

DevSeoRexยท2023๋…„ 7์›” 14์ผ
6
post-thumbnail

๐Ÿค” Proxy ๊ฐ์ฒด๋Š” ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ• ๊นŒ?

Spring์—์„œ AOP๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ๋Š” ์—ฌ๋Ÿฌ๋ฒˆ์˜ ํฌ์ŠคํŒ…์„ ํ†ตํ•ด์„œ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.
AOP๋Š” ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด์„œ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ์ฃผ์ž…ํ•˜๊ณ  ๋™์ž‘์‹œํ‚ค๋Š”๋ฐ, ๊ทธ๋ ‡๋‹ค๋ฉด Spring์—์„œ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š”์ง€์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ˜ฒ JDK Dynamic Proxy & CGLIB

ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์—๋Š” Dynamic Proxy์™€ CGLIB๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‘ ๋ฐฉ๋ฒ•์˜ ์ฐจ์ด์™€ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์— ๋Œ€ํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉฐ ์ฒœ์ฒœํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

JDK Dynamic Proxy

JDK Dynamic Proxy๋Š” JDK์—์„œ ์ง€์›ํ•˜๋Š” ํ”„๋ก์‹œ ์ƒ์„ฑ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์€ Target์€ JDK Dynamic Proxy๋ฅผ ์ด์šฉํ•œ ๋ถ€๊ฐ€๊ธฐ๋Šฅ ์ ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

JDK Dynamic Proxy๊ฐ€ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ์ ์šฉํ•˜๋Š” ๊ณผ์ •์„ ์ฝ”๋“œ๋กœ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ ์ž‘์„ฑ์œผ๋กœ JDK Dynamic Proxy ์•Œ์•„๋ณด๊ธฐ!


์ถ”์ƒ๋ฉ”์„œ๋“œ talk๋ฅผ ๊ฐ€์ง„ Person ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค.


talk ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ PersonImpl ๊ตฌํ˜„์ฒด ํด๋ž˜์Šค๋„ ์ž‘์„ฑํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.


Invocation Handler๋ฅผ ๊ตฌํ˜„ํ•œ PersonTarget ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ์„ธ๊ฐ€์ง€ ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด JDK Dynamic Proxy๋ฅผ ์ ์šฉํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

JDK Dynamic Proxy๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Proxy ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, JDK Dynamic Proxy๋Š” Reflection API๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


Proxy ํด๋ž˜์Šค์—์„œ ์ƒˆ๋กœ์šด ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ClassLoader์™€ ๊ตฌํ˜„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ํด๋ž˜์Šค ๋ฐฐ์—ด, InvocationHandler๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ๊ฐ€ ์ž‘์„ฑํ•œ PersonImpl์— ๋Œ€ํ•œ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ด์ œ ํ”„๋ก์‹œ๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š์€ ์ˆœ์ˆ˜ํ•œ PersonImpl ๊ฐ์ฒด์™€ ํ”„๋ก์‹œ๋ฅผ ์ด์šฉํ•ด ๋งŒ๋“  proxyPerson ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด talk ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.



ํ”„๋ก์‹œ๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š์€ PersonImpl ์ธ์Šคํ„ด์Šค๋กœ talk ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ถ€๊ฐ€๊ธฐ๋Šฅ ์—†์ด ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋ก์‹œ๋ฅผ ์ ์šฉํ•œ proxyPerson ์ธ์Šคํ„ด์Šค๋กœ talk ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์‹œ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์ด ์ ์šฉ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ”„๋ก์‹œ๊ฐ€ ์ ์šฉ๋œ ๊ฐ์ฒด๋Š” com.sun.proxy.$Proxy11๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ , ํ”„๋ก์‹œ๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋Š” com.adoptpet.server.adopt.exception.PersonImpl ์ผ๋ฐ˜์ ์ธ ํด๋ž˜์Šค ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ฐจ์ด๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

JDK Dynamic Proxy๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์œผ๋ฉด ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค๋Š” ์ ์ด ๋‹จ์ ์ž…๋‹ˆ๋‹ค.

์ด ๋ถ€๋ถ„์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ”๊ฟ”๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ PersonImpl ํด๋ž˜์Šค์˜ ์ •๋ณด๋ฅผ ๋„˜๊ฒจ์ฃผ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • JDK Dynamic Proxy๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์—๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • Reflection API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”์ดํŠธ ์ฝ”๋“œ ์กฐ์ž‘ ๋ฐฉ์‹์ธ CGLIB์— ๋น„ํ•ด ๋Š๋ฆฌ๋‹ค.
  • Invocation Handler์˜ invoke ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ด์ค˜์•ผ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์ด ๋™์ž‘ํ•œ๋‹ค.

JDK Dynamic Proxy๋Š” ์ด ์ •๋„๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค!

CGLIB(Code Generator Library)

CGLIB๋Š” ํด๋ž˜์Šค์˜ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ Proxy ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
CGLIB ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ Target์— ๋Œ€ํ•ด์„œ๋„ Proxy ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


"rabbit eats carrot" ์ด๋ผ๋Š” ๊ฐ„๋‹จํ•œ ๋ฌธ์žฅ์„ ์ถœ๋ ฅํ•˜๋Š” eat ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ Rabbit ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด ํด๋ž˜์Šค์— CGLIB๋ฅผ ์ด์šฉํ•˜์—ฌ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ์ฃผ์ž…ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

CGLIB๋ฅผ ์‚ฌ์šฉํ• ๋•Œ๋„ InvocationHandler๋ฅผ ํ™œ์šฉํ•œ ํ”„๋ก์‹œ ๊ฐ์ฒด ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
์ด ๋ฐฉ์‹์œผ๋กœ ๋จผ์ € ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ์ฃผ์ž…ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


Dynamic Proxy๋ฅผ ์‚ฌ์šฉํ• ๋•Œ์™€ ๋น„์Šทํ•˜์ง€๋งŒ, InvocationHandler์˜ ํŒจํ‚ค์ง€๊ฐ€ CGLIB ํŒจํ‚ค์ง€ ์•ˆ์— ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

CGLIB๋Š” ๋ฐ”์ดํŠธ ์ฝ”๋“œ ์กฐ์ž‘๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ JDK Dynamic Proxy์— ๋น„ํ•ด ์•ฝ 3๋ฐฐ์ •๋„ ์„ฑ๋Šฅ์ด ์šฐ์ˆ˜ํ•˜์ง€๋งŒ, InvocationHandler๋ฅผ ์‚ฌ์šฉํ• ๊ฒฝ์šฐ Reflection API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์ด์ ์„ ๋ˆ„๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋ฐ”์ดํŠธ ์ฝ”๋“œ ์กฐ์ž‘๋ฐฉ์‹์„ ์ด์šฉํ•˜๋Š” ํ”„๋ก์‹œ ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ์‹์„ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” MethodInterceptor๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์„ ์ทจํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ด ๋ถ€๋ถ„์€ ์ž ์‹œ ํ›„์— ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์˜ˆ์ƒ๋Œ€๋กœ ์ฝ”๋“œ๊ฐ€ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


๋ถ€๊ฐ€๊ธฐ๋Šฅ์ด ์ž˜ ๋™์ž‘ํ•˜๊ณ  ์žˆ๊ณ , ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” Rabbit ์ธ์Šคํ„ด์Šค๋Š” ํ”„๋ก์‹œ ๊ฐ์ฒด๊ฐ€ ๋งž๋‹ค๋Š” ๊ฒƒ๊นŒ์ง€ ํ™•์ธ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ MethodInterceptor๋ฅผ ํ™œ์šฉํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

MethodInterceptor ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๊ณ , ์•„๊นŒ์™€ ๊ฐ™์ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

InvocationHandler๋ฅผ ์‚ฌ์šฉํ• ๋•Œ์™€ ๋‹ฌ๋ผ์ง„์ ์€ setCallback ๋ฉ”์„œ๋“œ์˜ ์ธ์ž๋กœ MethodInterceptor๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋„ฃ์–ด์ค€๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.


์ฝ”๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JDK Dynamic Proxy๋Š” ๊ตฌํ˜„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์„๋•Œ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด CGLIB ๋ฐฉ์‹์—์„œ๋Š” ์–ด๋–ค ์กฐ๊ฑด์ด ๋งŒ์กฑ๋˜์–ด์•ผ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

CGLIB ๋ฐฉ์‹์—์„œ๋Š” Target์„ ์ƒ์†๋ฐ›์•„ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํด๋ž˜์Šค๊ฐ€ final ์ด๋ผ๋ฉด ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๊ณ  ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ์ ์šฉํ•  ๋ฉ”์„œ๋“œ๊ฐ€ final ์ด๋ผ๋ฉด ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์ด ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Target(ํด๋ž˜์Šค)์ด final์ธ ๊ฒฝ์šฐ


Rabbit ํด๋ž˜์Šค๋ฅผ final๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


ํด๋ž˜์Šค๋ฅผ final๋กœ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Target(ํด๋ž˜์Šค)์˜ ๋ฉ”์„œ๋“œ๊ฐ€ final์ธ ๊ฒฝ์šฐ


Rabbit ํด๋ž˜์Šค์˜ eat ๋ฉ”์„œ๋“œ๋ฅผ final๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , run ๋ฉ”์„œ๋“œ๋ฅผ ์ƒˆ๋กœ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
eat์„ ํ˜ธ์ถœํ•˜๋ฉด ๋ถ€๊ฐ€๊ธฐ๋Šฅ์ด ์ ์šฉ๋˜์ง€ ์•Š๊ณ , run์„ ํ˜ธ์ถœํ•˜๋ฉด ๋ถ€๊ฐ€๊ธฐ๋Šฅ์ด ์ ์šฉ๋˜๋Š”์ง€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


eat ๋ฉ”์„œ๋“œ์˜ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์€ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CGLIB๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋‹จ์ ์ด ์กด์žฌํ–ˆ์Šต๋‹ˆ๋‹ค.

  • net.sf.cglib.proxy.Enhancer ์˜์กด์„ฑ ์ถ”๊ฐ€ ํ•„์š”
  • Default ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”
  • Target(ํด๋ž˜์Šค)์˜ ์ƒ์„ฑ์ž ๋‘ ๋ฒˆ ํ˜ธ์ถœ

์ด ๋‹จ์ ๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ชจ๋‘ ํ•ด๊ฒฐ๋˜์–ด ์Šคํ”„๋ง์—์„œ ๋” ์„ฑ๋Šฅ ์ข‹์€ CGLIB๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • net.sf.cglib.proxy.Enhancer ์˜์กด์„ฑ ์ถ”๊ฐ€ ํ•„์š” -> spring.core ํŒจํ‚ค์ง€์— ์ถ”๊ฐ€ํ•˜์—ฌ ์˜์กด์„ฑ ์ถ”๊ฐ€ ๋ถˆํ•„์š”
  • Default ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š” -> Objensis ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•ด๊ฒฐ
  • Target(ํด๋ž˜์Šค)์˜ ์ƒ์„ฑ์ž ๋‘ ๋ฒˆ ํ˜ธ์ถœ -> Objensis ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•ด๊ฒฐ

๐Ÿง Spring์—์„œ Proxy๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•!

์ง€๊ธˆ๊นŒ์ง€ ์ฝ”๋“œ๋กœ JDK Dynamic Proxy์™€ CGLIB ๋ฐฉ์‹์„ ๋น„๊ตํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด Spring์—์„œ๋Š” ์–ด๋–ป๊ฒŒ Proxy๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ง€๊ธˆ๋ถ€ํ„ฐ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์Šคํ”„๋ง์—์„œ๋Š” ProxyFactoryBean์„ ํ™œ์šฉํ•˜์—ฌ ํ”„๋ก์‹œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•œ AOP๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.


๊ตฌํ˜„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด JDK Dynamic Proxy๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์„๊ฒฝ์šฐ CGLIB๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ด์™”์Šต๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ ํ”„๋ก์‹œ๋Š” ๋•Œ๋•Œ๋กœ ClassCastException์„ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์—, CGLIB๋ฅผ Spring Boot์—์„œ Default๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

proxy-target-class ์˜ต์…˜์„ false๋กœ ์„ค์ •ํ•œ๋‹ค๋ฉด, JDK Dynamic Proxy๊ฐ€ ์ž‘๋™ํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

๐Ÿค  ๋‹ค์Œ์œผ๋กœ..!!

AOP๋ฅผ ํ™œ์šฉํ•œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ๋„, ์–ด๋–ป๊ฒŒ ์ด๋Ÿฐ ๋†€๋ผ์šด ํŽธ์˜์„ฑ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋‚ด๋ถ€ ๋™์ž‘์— ๋Œ€ํ•œ ์ดํ•ด๋Š” ํ•˜๋‚˜๋„ ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ํฌ์ŠคํŒ…์„ ๊ณ„๊ธฐ๋กœ ์•ž์œผ๋กœ๋„ ๋‚ด๋ถ€ ๋™์ž‘์— ๋Œ€ํ•ด ๊ถ๊ธˆํ•œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๋ฉด์„œ ์ดํ•ดํ•˜๊ณ  ๊ผญ ๋‚ด๋ถ€ ๋™์ž‘์— ๋Œ€ํ•ด ์ดํ•ดํ•ด์•ผ ํ•˜๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜๋„ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๐Ÿ™‡

์ฐธ๊ณ ํ•œ ๋ ˆํผ๋Ÿฐ์Šค

4๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2023๋…„ 7์›” 14์ผ

๊ฐœ์ŠˆํผํŒ๊ฐœ๋ฐ์„œ๋ ‰์Šค..

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2023๋…„ 7์›” 18์ผ

ํ•ญ์ƒ ์ฐธ๊ณ  ๋งŽ์ด ํ•˜๊ณ ์žˆ์Šต๋‹ˆ๋‹น ใ…Žใ…Ž ์ข‹์€ ๊ธ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

1๊ฐœ์˜ ๋‹ต๊ธ€