Bean definition inheritance

Bean Definition Inheritance(๋นˆ ์ •์˜ ์ƒ์†)๋Š” Spring์—์„œ ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์œผ๋กœ, ๋ถ€๋ชจ Bean ์ •์˜์—์„œ ๋งŽ์€ ์„ค์ • ์ •๋ณด๋ฅผ ์ž์‹ Bean ์ •์˜์— ์ƒ์†ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒ์† ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์„ฑ์ž ์ธ์ž, ํ”„๋กœํผํ‹ฐ ๊ฐ’, ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ, ์Šค์ฝ”ํ”„ ๋“ฑ์˜ ์„ค์ •์„ ๋ถ€๋ชจ Bean์œผ๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ผ๋ถ€ ์„ค์ •๋งŒ ๋ฎ์–ด์“ฐ๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์€ XML ๊ธฐ๋ฐ˜์˜ Spring ๊ตฌ์„ฑ์—์„œ ํŠนํžˆ ์œ ์šฉํ•˜๋ฉฐ, Bean ์„ค์ •์„ ํ…œํ”Œ๋ฆฟ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ ์ค‘๋ณต์„ ์ค„์ด๊ณ  ๊ตฌ์„ฑ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Bean ์ƒ์†์˜ ๊ธฐ๋ณธ ๊ฐœ๋…

๋ถ€๋ชจ Bean ์ •์˜์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์†์„ฑ๋“ค์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ์ƒ์„ฑ์ž ์ธ์ž

  • ํ”„๋กœํผํ‹ฐ ๊ฐ’

  • ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ ๋ฐ ์†Œ๋ฉธ ๋ฉ”์„œ๋“œ

  • ์Šค์ฝ”ํ”„

  • ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ์ด๋ฆ„

์ž์‹ Bean ์ •์˜๋Š” ์ด๋Ÿฌํ•œ ์†์„ฑ์„ ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ผ๋ถ€ ์†์„ฑ๋งŒ ์žฌ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์‹ Bean ์ •์˜์˜ ํŠน์ง•

์ƒ์†๋œ ์†์„ฑ

  • ์ž์‹ Bean ์ •์˜๋Š” ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ์ž ์ธ์ž, ํ”„๋กœํผํ‹ฐ ๊ฐ’, ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋“œ, ์Šค์ฝ”ํ”„ ๋“ฑ์„ ์ƒ์†๋ฐ›์Šต๋‹ˆ๋‹ค.

  • ์ž์‹ Bean์€ ์ƒ์†๋ฐ›์€ ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ์ ์ธ ์„ค์ •

  • ์ผ๋ถ€ ์†์„ฑ์€ ์ž์‹ Bean์ด ํ•ญ์ƒ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, depends-on, autowire mode, dependency check, singleton, lazy-init ๋“ฑ์˜ ์„ค์ •์€ ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ ์ƒ์†๋˜์ง€ ์•Š๊ณ , ์ž์‹ ์ •์˜์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ถ€๋ชจ Bean ์ •์˜ (์ถ”์ƒ ํด๋ž˜์Šค์ฒ˜๋Ÿผ ๋™์ž‘)

<bean id="inheritedTestBean" abstract="true" class="org.springframework.beans.TestBean">
    <property name="name" value="parent"/>
    <property name="age" value="1"/>
</bean>
  • ์ด inheritedTestBean์€ ์ถ”์ƒ Bean์œผ๋กœ ์„ค์ •๋˜์—ˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ Bean์ด ์ด ์ •์˜๋ฅผ ์ƒ์†ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • name ์†์„ฑ์€ "parent"๋กœ, age ์†์„ฑ์€ 1๋กœ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์‹ Bean ์ •์˜

<bean id="inheritsWithDifferentClass" class="org.springframework.beans.DerivedTestBean"
      parent="inheritedTestBean" init-method="initialize">
    <property name="name" value="override"/>
    <!-- age ์†์„ฑ์€ ๋ถ€๋ชจ Bean ์ •์˜์—์„œ ์ƒ์†๋ฐ›์•„ 1๋กœ ์„ค์ •๋จ -->
</bean>
  • ์ด inheritsWithDifferentClass Bean์€ ๋ถ€๋ชจ์ธ inheritedTestBean์œผ๋กœ๋ถ€ํ„ฐ name๊ณผ age ์†์„ฑ์„ ์ƒ์†๋ฐ›์Šต๋‹ˆ๋‹ค.

  • name ์†์„ฑ์€ override๋กœ ๋ฎ์–ด์“ฐ์˜€์ง€๋งŒ, age๋Š” ์ƒ์†๋œ ๊ฐ’์ธ 1์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ๋˜ํ•œ, ์ž์‹ Bean์€ ์ƒˆ๋กœ์šด ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ(init-method="initialize")๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ถ”์ƒ Bean ์ •์˜

๋ถ€๋ชจ Bean ์ •์˜๊ฐ€ ์ถ”์ƒ(abstract)์œผ๋กœ ์„ค์ •๋˜๋ฉด, ์ด Bean์€ ์ž์ฒด์ ์œผ๋กœ๋Š” ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ถ”์ƒ Bean์€ ์˜ค์ง ํ…œํ”Œ๋ฆฟ์œผ๋กœ๋งŒ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ž์‹ Bean์ด ์ด๋ฅผ ์ƒ์†ํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<bean id="inheritedTestBeanWithoutClass" abstract="true">
    <property name="name" value="parent"/>
    <property name="age" value="1"/>
</bean>

<bean id="inheritsWithClass" class="org.springframework.beans.DerivedTestBean"
      parent="inheritedTestBeanWithoutClass" init-method="initialize">
    <property name="name" value="override"/>
    <!-- age๋Š” ๋ถ€๋ชจ Bean ์ •์˜์—์„œ ์ƒ์†๋ฐ›์•„ 1๋กœ ์„ค์ •๋จ -->
</bean>

์—ฌ๊ธฐ์„œ inheritedTestBeanWithoutClass๋Š” ํด๋ž˜์Šค๊ฐ€ ๋ช…์‹œ๋˜์ง€ ์•Š์€ ์ถ”์ƒ Bean์œผ๋กœ, ์˜ค์ง ํ…œํ”Œ๋ฆฟ์œผ๋กœ๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

abstract ์†์„ฑ:

  • ๋ถ€๋ชจ Bean ์ •์˜๊ฐ€ ์ถ”์ƒ์ ์œผ๋กœ ์„ค์ •๋˜์ง€ ์•Š์œผ๋ฉด, Spring ์ปจํ…์ŠคํŠธ๋Š” ์ด Bean์„ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์ถ”์ƒ Bean ์ •์˜๋Š” **๋ฐ˜๋“œ์‹œ abstract="true"**๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ถ”์ƒ Bean์€ getBean() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ง์ ‘ ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ…œํ”Œ๋ฆฟ์œผ๋กœ๋งŒ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ž์‹ Bean์˜ ํด๋ž˜์Šค:

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

ApplicationContext์™€ ์‹ฑ๊ธ€ํ†ค:

  • Spring์˜ ApplicationContext๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์‹ฑ๊ธ€ํ†ค Bean์„ ๋ฏธ๋ฆฌ ์ธ์Šคํ„ด์Šคํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ…œํ”Œ๋ฆฟ์œผ๋กœ๋งŒ ์‚ฌ์šฉ๋  ๋ถ€๋ชจ Bean์ด abstract="true"๋กœ ์„ค์ •๋˜์ง€ ์•Š์œผ๋ฉด, Spring์€ ์ด๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Spring์˜ Bean ์ •์˜ ์ƒ์†์€ ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๋กœ ์„ค์ •๋œ Bean ์ •์˜ ๊ฐ„์— ์†์„ฑ ๊ฐ’์„ ์ƒ์†ํ•˜๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ž์‹ Bean์—์„œ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ ์ค‘๋ณต์„ ์ค„์ด๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ •์„ ํ…œํ”Œ๋ฆฟ ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

abstract ์†์„ฑ์€ ๋ถ€๋ชจ Bean์„ ํ…œํ”Œ๋ฆฟ์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์„ค์ •ํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ž์‹ Bean์—์„œ ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค

Last updated