Container Extension Points

Spring ์ปจํ…Œ์ด๋„ˆ ํ™•์žฅ ํฌ์ธํŠธ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ApplicationContext ํด๋ž˜์Šค๋ฅผ ์„œ๋ธŒํด๋ž˜์‹ฑํ•˜์ง€ ์•Š๊ณ ๋„ Spring IoC ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ํ†ตํ•ฉ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด ์ค‘์—์„œ BeanPostProcessor, BeanFactoryPostProcessor, ๊ทธ๋ฆฌ๊ณ  FactoryBean ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Customizing Beans by Using a BeanPostProcessor

BeanPostProcessor ์ธํ„ฐํŽ˜์ด์Šค๋Š” Spring ์ปจํ…Œ์ด๋„ˆ๊ฐ€ Bean์„ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ณ , ์„ค์ •ํ•˜๊ณ , ์ดˆ๊ธฐํ™”ํ•œ ํ›„์— ํ˜ธ์ถœ๋˜๋Š” ์ฝœ๋ฐฑ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ์˜ ๊ธฐ๋ณธ ์ธ์Šคํ„ด์Šคํ™” ๋กœ์ง์ด๋‚˜ ์˜์กด์„ฑ ํ•ด๊ฒฐ ๋กœ์ง์„ ๋ฎ์–ด์“ฐ๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž ์ •์˜ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ๋ฐ ์‹คํ–‰ ์ˆœ์„œ ์ œ์–ด

์—ฌ๋Ÿฌ BeanPostProcessor ์ธ์Šคํ„ด์Šค๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋•Œ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ order ์†์„ฑ์„ ํ†ตํ•ด ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ, ์ด ์†์„ฑ์€ Ordered ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง์ ‘ BeanPostProcessor๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ Ordered ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์„ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ž‘๋™ ์›๋ฆฌ

BeanPostProcessor ์ธ์Šคํ„ด์Šค๋Š” Spring IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ Bean ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ํ•ด๋‹น Bean์— ๋Œ€ํ•ด ํ›„์ฒ˜๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์ฝœ๋ฐฑ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค:

  • postProcessBeforeInitialization: ์ปจํ…Œ์ด๋„ˆ์˜ ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์ „, ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

  • postProcessAfterInitialization: ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ํ›„, ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ถ”๊ฐ€ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

BeanPostProcessor์˜ ๋ฒ”์œ„

BeanPostProcessor ์ธ์Šคํ„ด์Šค๋Š” ์ปจํ…Œ์ด๋„ˆ ๋‹จ์œ„๋กœ ์Šค์ฝ”ํ”„๊ฐ€ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ณ„์ธต์„ ์‚ฌ์šฉํ•  ๋•Œ๋งŒ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•œ ์ปจํ…Œ์ด๋„ˆ์— ์ •์˜๋œ BeanPostProcessor๋Š” ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์˜ Bean๋งŒ ํ›„์ฒ˜๋ฆฌํ•˜๋ฉฐ, ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์— ์ •์˜๋œ Bean์€ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋™์ผํ•œ ๊ณ„์ธต์˜ ์ผ๋ถ€์ด๋”๋ผ๋„ ํ›„์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Bean ์ •์˜ ๋ณ€๊ฒฝ ๋ฐฉ๋ฒ•

์‹ค์ œ Bean ์ •์˜(์ฆ‰, Bean์„ ์ •์˜ํ•˜๋Š” ์ฒญ์‚ฌ์ง„)๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด BeanFactoryPostProcessor๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์„ค์ • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ •ํ•˜์—ฌ Bean์ด ์ธ์Šคํ„ด์Šคํ™”๋˜๊ธฐ ์ „์— Bean์˜ ์ •์˜๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝœ๋ฐฑ ๋ฉ”์„œ๋“œ

BeanPostProcessor ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ •ํ™•ํžˆ ๋‘ ๊ฐœ์˜ ์ฝœ๋ฐฑ ๋ฉ”์„œ๋“œ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค๊ฐ€ ํ›„์ฒ˜๋ฆฌ๊ธฐ๋กœ ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก๋˜๋ฉด, ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ƒ์„ฑ๋œ ๊ฐ Bean ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•ด ํ›„์ฒ˜๋ฆฌ๊ธฐ๊ฐ€ ๋‘ ๋ฒˆ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

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

Spring AOP ์ธํ”„๋ผ ํด๋ž˜์Šค ์ค‘ ์ผ๋ถ€๋Š” ์ด ํ›„์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋ก์‹œ ๋ž˜ํ•‘ ๋กœ์ง์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ž๋™ ๊ฐ์ง€ ๋ฐ ๋“ฑ๋ก

ApplicationContext๋Š” BeanPostProcessor ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” Bean์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ Bean์ด ์ƒ์„ฑ๋  ๋•Œ ์ด๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก BeanPostProcessor๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

Bean ํ›„์ฒ˜๋ฆฌ๊ธฐ๋Š” ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ๋‹ค๋ฅธ Bean๊ณผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฐฐํฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

BeanPostProcessor์˜ ํ”„๋กœ๊ทธ๋žจ ๋ฐฉ์‹ ๋“ฑ๋ก

BeanPostProcessor ๋“ฑ๋ก์„ ์œ„ํ•œ ๊ถŒ์žฅ ๋ฐฉ๋ฒ•์€ ApplicationContext ์ž๋™ ๊ฐ์ง€๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€์ง€๋งŒ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ConfigurableBeanFactory์˜ addBeanPostProcessor ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋“ฑ๋กํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ๋“ฑ๋ก ์ „์— ์กฐ๊ฑด๋ถ€ ๋กœ์ง์„ ํ‰๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ปจํ…Œ์ด๋„ˆ ๊ณ„์ธต์—์„œ BeanPostProcessor๋ฅผ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฐฉ์‹์œผ๋กœ ๋“ฑ๋ก๋œ BeanPostProcessor๋Š” Ordered ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์กด์ค‘ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋“ฑ๋ก๋œ ์ˆœ์„œ๊ฐ€ ๊ณง ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

AOP ์ž๋™ ํ”„๋ก์‹ฑ๊ณผ BeanPostProcessor

BeanPostProcessor ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋Š” ํŠน๋ณ„ํ•˜๋ฉฐ, ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  BeanPostProcessor ์ธ์Šคํ„ด์Šค์™€ ์ง์ ‘ ์ฐธ์กฐ๋˜๋Š” Bean์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ์˜ ํŠน๋ณ„ํ•œ ์‹œ์ž‘ ๋‹จ๊ณ„์—์„œ ์ธ์Šคํ„ด์Šคํ™”๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ชจ๋“  BeanPostProcessor ์ธ์Šคํ„ด์Šค๊ฐ€ ์ •๋ ฌ๋œ ๋ฐฉ์‹์œผ๋กœ ๋“ฑ๋ก๋˜๊ณ , ์ดํ›„ ์ƒ์„ฑ๋œ Bean์— ๋Œ€ํ•ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. AOP ์ž๋™ ํ”„๋ก์‹ฑ์€ BeanPostProcessor๋กœ ๊ตฌํ˜„๋˜๊ธฐ ๋•Œ๋ฌธ์—, BeanPostProcessor ์ธ์Šคํ„ด์Šค๋‚˜ ๊ทธ๊ฒƒ์ด ์ง์ ‘ ์ฐธ์กฐํ•˜๋Š” Bean์€ ์ž๋™ ํ”„๋ก์‹ฑ ๋Œ€์ƒ์ด ์•„๋‹ˆ๋ฉฐ, ๋”ฐ๋ผ์„œ ์• ์ŠคํŽ™ํŠธ๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ BeanPostProcessor์— @Autowired ๋˜๋Š” @Resource๋กœ ์—ฐ๊ฒฐ๋œ Bean์ด ์žˆ๋‹ค๋ฉด, Spring์ด ํƒ€์ž… ๋งค์นญ ์˜์กด์„ฑ ํ›„๋ณด๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์—์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ Bean์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋กœ ์ธํ•ด ํ•ด๋‹น Bean์ด ์ž๋™ ํ”„๋ก์‹ฑ ๋˜๋Š” ๋‹ค๋ฅธ ํ›„์ฒ˜๋ฆฌ ์ž‘์—…์— ์ ํ•ฉํ•˜์ง€ ์•Š๊ฒŒ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Customizing Configuration Metadata with a BeanFactoryPostProcessor

BeanFactoryPostProcessor ์ธํ„ฐํŽ˜์ด์Šค๋Š” Spring IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ Bean์„ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ธฐ ์ „์— Bean ์„ค์ • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ํ™•์žฅ ํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์„ค์ • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Bean์„ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ธฐ ์ „์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘ ๋ฐฉ์‹

  • BeanFactoryPostProcessor๋Š” ์„ค์ • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜๋ฏ€๋กœ, Bean์ด ์ธ์Šคํ„ด์Šคํ™”๋˜๊ธฐ ์ „ Bean ์ •์˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์—ฌ๋Ÿฌ BeanFactoryPostProcessor ์ธ์Šคํ„ด์Šค๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, order ์†์„ฑ์„ ์‚ฌ์šฉํ•ด ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ, ์ด ์†์„ฑ์€ Ordered ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

BeanFactoryPostProcessor๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋ฐ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, Bean ์ธ์Šคํ„ด์Šค๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜๋ ค๋ฉด BeanPostProcessor๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

Last updated