[Error] Bean could not be injected because it is a JDK dynamic proxy

ํ•„์š” ์„ ํ–‰ ์ง€์‹

CGLIB vs JDK Dynamic Proxy

  • ๋‘˜ ๋‹ค ๋ชจ๋‘ Spring์—์„œ AOP ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ”„๋ก์‹œ ์ƒ์„ฑ ๊ธฐ๋ฒ•

CGLIB

  • ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์กฐ์ž‘ํ•ด ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑ

  • ๋ณธ ๊ฐ์ฒด๋ฅผ ์ƒ์†ํ•˜๋Š” ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฉค๋ฒ„ ๊ฐ์ฒด๋กœ ํƒ€๊ฒŸ(์‹ค์ œ ๊ฐ์ฒด)์„ ์†Œ์œ 

  • ์ƒ์†์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, final์ด ๋ถ€์—ฌ๋˜์—ˆ๊ฑฐ๋‚˜ ์ ‘๊ทผ ์ œ์–ด์ž๊ฐ€ private์ธ ๋ฉ”์†Œ๋“œ์—๋Š” ์ ์šฉํ•  ์ˆ˜ ์—†์Œ

JDK Dynamic Proxy

  • ๋ฆฌํ”Œ๋ ‰์…˜์„ ์ด์šฉ

  • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋ฉค๋ฒ„ ๊ฐ์ฒด๋กœ ํƒ€๊ฒŸ(์‹ค์ œ ๊ฐ์ฒด)์„ ์†Œ์œ 

  • AOP๊ฐ€ ์ ์šฉ๋œ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์‹œ ํ”„๋ก์‹œ ๊ฐ์ฒด์—์„œ Advice ๋กœ์ง ์ „ or ํ›„๋กœ ํƒ€๊ฒŸ ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ํ•ต์‹ฌ ๋กœ์ง์ด ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ํ•จ

  • Spring์—์„œ๋Š” ํด๋ž˜์Šค๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ ์ด ํด๋ž˜์Šค์˜ ํ”„๋ก์‹œ๋Š” JDK dynamic proxy ๊ธฐ๋ฒ•์œผ๋กœ ์ƒ์„ฑ

Error - Bean could not be injected because it is a JDK dynamic proxy

  • ํ•ด๋‹น ์˜ค๋ฅ˜๋Š”, ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ์ฃผ์ž…๋ฐ›๊ณ ์ž ํ•  ๋•Œ ๋ฐœ์ƒ

  • ํ•ด๋‹น ์˜ค๋ฅ˜์—์„œ ์–ธ๊ธ‰ํ•œ Bean์ด CGLIB ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋˜๋„๋ก ํ•จ์œผ๋กœ์จ ์ด ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ

  • Spring์—์„œ๋Š” proxyTargetClass ๋ผ๋Š” ์˜ต์…˜์„ ํ†ตํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค์˜ ํ”„๋ก์‹œ๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑํ• ์ง€ ํด๋ž˜์Šค ์ƒ์† ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑํ• ์ง€๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ

    • false (default): ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜

    • true: ํด๋ž˜์Šค ์ƒ์† ๊ธฐ๋ฐ˜

์—ฌ๋‹ด

  • ์ตœ๊ทผ์ด ๋˜์–ด์„œ์•ผ AOP ๊ณต๋ถ€๋ฅผ ํ–ˆ๋Š”๋ฐ, AOP์— ๋Œ€ํ•œ ์ง€์‹ ์—†์ด ์ด ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋‚ฌ์œผ๋ฉด ์ดํ•ด๋„ ๋ชปํ•˜๊ณ  ๋ฒ™์ช˜์„ ๊ฒƒ ๊ฐ™๋‹ค.

  • ์—ญ์‹œ ๊ธฐ๋ณธ ๊ฐœ๋…์ด ์ค‘์š”ํ•˜๋‹คโ€ฆ

Reference

Last updated