JiwonDev

BeanFactory, BeanDefinition (+ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ XML ์„ค์ •)

by JiwonDev

# ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” BeanFactory์™€ ApplicationContext๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค. ์ด๊ฑด ๋ฌด์Šจ ์˜๋ฏธ์ผ๊นŒ?

@ BeanFactory

  • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์˜ ์ตœ์ƒ์œ„ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.
  • ์Šคํ”„๋ง ๋นˆ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์กฐํšŒํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค.
  • getBean() ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋“ฑ๋ก๋œ ๋นˆ์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
  • ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ–ˆ๋˜ ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์€ BeanFactory๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

 

@ ApplicationContext

BeanFactory์˜ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ์ƒ์†๋ฐ›์•„ ์ œ๊ณตํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๊ตณ์ด BeanFactory์™€ ApplicationContext๋ฅผ ๋‚˜๋ˆˆ ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ? ๊ทธ๊ฑด ๋ฐ”๋กœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ ๋นˆ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ๊ณผ ๋”๋ถˆ์–ด ์ˆ˜๋งŽ์€ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ถ€๊ฐ€๊ธฐ๋Šฅ์€ ์„ค๋ช…ํ•˜๋ฉด ์ •๋ง ๋‚ด์šฉ์ด ๊ธธ์–ด์ง€๋‹ˆ, ๋‚˜์ค‘์— ๋”ฐ๋กœ ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

  • MessageSource : ๋ฉ”์‹œ์ง€ ์†Œ์Šค๋ฅผ ํ™œ์šฉํ•œ ๊ตญ์ œํ™” ๊ธฐ๋Šฅ(๋‚˜๋ผ๋ณ„ ์–ธ์–ด ์„ค์ •)
  • EnviromentCapable : ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ธฐ๋Šฅ, ๋กœ์ปฌ - ๊ฐœ๋ฐœ - ์šด์˜๋“ฑ์„ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ฒ˜๋ฆฌ
  • ApplicationEventPublisher : ์•ฑ ์ด๋ฒคํŠธ, ์ด๋ฒคํŠธ๋ฅผ ๋ฐœํ–‰ํ•˜๊ณ  ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋ธ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ง€์›
  • ResourceLoader : ํŽธ๋ฆฌํ•œ ๋ฆฌ์†Œ์Šค ์กฐํšŒ, ํŒŒ์ผ - ํด๋ž˜์ŠคํŒจ์Šค - ์™ธ๋ถ€๋“ฑ์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์กฐํšŒ

 


@ ๊ฒฐ๋ก 

  • ApplicationContext๋Š” BeanFactory์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ƒ์†๋ฐ›๋Š”๋‹ค
  • App..Context ๋Š” BeanFactory์˜ ๋นˆ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ + ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
  • BeanFactory๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ผ์€ ์—†๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.
  • BeanFactory๋‚˜ App..Context ๋‘˜ ๋‹ค ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 


# ๋‹ค์–‘ํ•œ ์„ค์ • ํ˜•์‹ ์ง€์› - Java, XML

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ๋‹ค์–‘ํ•œ ํ˜•์‹์˜ ์„ค์ •์ •๋ณด๋ฅผ ๋ฐ›์•„๋“œ๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ์„ค๊ณ„๋˜์–ด ์žˆ๋‹ค. ๋ณดํ†ต์€ Java ์ฝ”๋“œ์˜ ์–ด๋…ธํ…Œ์ด์…˜(@)์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ํ•„์š”ํ•˜๋‹ค๋ฉด XML๋“ฑ ๋‹ค๋ฅธ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค.

 

๋ฌผ๋ก  ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ ๋‚˜์˜ค๋ฉฐ ์–ด๋…ธํ…Œ์ด์…˜ ๋ฐฉ์‹ ๋ง๊ณ ๋Š” ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ, ์˜› ํ”„๋กœ์ ํŠธ์˜ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋Š” XML๋กœ ์ž‘์„ฑ๋œ ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์žˆ์œผ๋‹ˆ ์ด๋Ÿฐ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„๋งŒ ๋‘๊ณ  ๋„˜์–ด๊ฐ€๋„๋ก ํ•˜์ž. ํ˜•์‹๋งŒ ๋‹ค๋ฅผ ๋ฟ ์„ค์ •๋ฐฉ๋ฒ•์€ ๋น„์Šทํ•˜๋‹ค.

๊ตฌํ˜„์ฒด๋ฅผ ๋ฐ”๊พธ๋ฉด XML๋กœ๋„ ์„ค์ •์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

public class XmlAppContext {
    @Test
    void xmlAppContext() {
    	// AppConfig.java ๊ฐ์ฒด ๋Œ€์‹ ์— appConfig.xml๋ฅผ ๋“ฑ๋กํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
        ApplicationContext ac = new
                GenericXmlApplicationContext("appConfig.xml");

        MemberService memberService = ac.getBean("memberService",
                MemberService.class);
        assertThat(memberService).isInstanceOf(MemberService.class);
    }
}
appConfig.xml

<?xml version="1.0"encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://">
    <bean id="memberService" class="hello.core.member.MemberServiceImpl">
        <constructor-arg name="memberRepository" ref="memberRepository"/>
    </bean>
    <bean id="memberRepository"
          class="hello.core.member.MemoryMemberRepository"/>
    <bean id="orderService" class="hello.core.order.OrderServiceImpl">
        <constructor-arg name="memberRepository" ref="memberRepository"/>
        <constructor-arg name="discountPolicy" ref="discountPolicy"/>
    </bean>
    <bean id="discountPolicy" class="hello.core.discount.RateDiscountPolicy"/>
</beans>

 


# ์Šคํ”„๋ง ๋นˆ ์„ค์ • ๋ฉ”ํƒ€ ์ •๋ณด - BeanDefinition

์œ„์—์„œ ๋ณด๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ์Šคํ”„๋ง ์„ค์ •์€ ์ž๋ฐ”, XML, Groovy๋“ฑ์œผ๋กœ ๊ตฌํ˜„์ฒด๋ฅผ ๋ฐ”๊พธ๋”๋ผ๋„ ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” BeanDefinition์—๋งŒ ์˜์กดํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ๋‹ค. ์ฆ‰, ๋‚ด๊ฐ€ ์ง์ ‘ BeanDefinition ๊ตฌํ˜„์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ง์ ‘ ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. (๋ฌผ๋ก  ์‹ค์ œ๋กœ ํ•  ์ผ์€ ๊ฑฐ์˜ ์—†๋‹ค.)

์šฐ๋ฆฌ๊ฐ€ @Bean ๋˜๋Š” ์™€ ๊ฐ™์€ ์„ค์ •์ •๋ณด ํ•˜๋‚˜๋‹น, ํ•˜๋‚˜์˜ ๋ฉ”ํƒ€์ •๋ณด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ BeanDefinition๋ฅผ ๋งŒ๋“ ๋‹ค. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์‹ค์ œ ์„ค์ • ์ •๋ณด๊ฐ€ ์•„๋‹Œ ์ด ๋ฉ”ํƒ€์ •๋ณด(BeanDefinition)๋งŒ์„ ๋ณด๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์Šคํ”„๋ง ๋นˆ์„ ์ƒ์„ฑํ•œ๋‹ค.

์„ค์ •ํŒŒ์ผ์„ ์ฝ๋Š”๊ฑด BeanDefinitionReader ๊ฐ์ฒด์ด๋‹ค. ํ•ด๋‹น ๊ฐ์ฒด๋Š” BeanDefinition ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.

 

@ BeanDefinition ๊ฐ์ฒด ํ•„๋“œ

  • BeanClassName: ์ƒ์„ฑํ•  ๋นˆ์˜ ํด๋ž˜์Šค ๋ช…(์ž๋ฐ” ์„ค์ • ์ฒ˜๋Ÿผ ํŒฉํ† ๋ฆฌ ์—ญํ• ์˜ ๋นˆ์„ ์‚ฌ์šฉํ•˜๋ฉด ์—†์Œ)
  • factoryBeanName: ํŒฉํ† ๋ฆฌ ์—ญํ• ์˜ ๋นˆ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ด๋ฆ„, ์˜ˆ) appConfig
  • factoryMethodName: ๋นˆ์„ ์ƒ์„ฑํ•  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ์ง€์ •, ์˜ˆ) memberService
  • Scope: ์‹ฑ๊ธ€ํ†ค(๊ธฐ๋ณธ๊ฐ’)
  • lazyInit: ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋นˆ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์‹ค์ œ ๋นˆ์„ ์‚ฌ์šฉํ•  ๋•Œ ๊นŒ์ง€ ์ตœ๋Œ€ํ•œ
    ์ƒ์„ฑ์„ ์ง€์—ฐ์ฒ˜๋ฆฌ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€
  • InitMethodName: ๋นˆ์„ ์ƒ์„ฑํ•˜๊ณ , ์˜์กด๊ด€๊ณ„๋ฅผ ์ ์šฉํ•œ ๋’ค์— ํ˜ธ์ถœ๋˜๋Š” ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ ๋ช…
  • DestroyMethodName: ๋นˆ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ๋๋‚˜์„œ ์ œ๊ฑฐํ•˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ ๋ช…
  • Constructor arguments, Properties: ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์—์„œ ์‚ฌ์šฉํ•œ๋‹ค. (์ž๋ฐ” ์„ค์ • ์ฒ˜๋Ÿผ ํŒฉํ† ๋ฆฌ ์—ญํ• 
    ์˜ ๋นˆ์„ ์‚ฌ์šฉํ•˜๋ฉด ์—†์Œ)

์‚ฌ์‹ค BeanDefinition์˜ ๋‚ด๋ถ€๋ฅผ ์•Œ ํ•„์š”๋Š” ๋”ฑํžˆ ์—†์ง€๋งŒ, ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ์ฝ”๋“œ๋‚˜ ์Šคํ”„๋ง ๊ด€๋ จ ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณผ ๋•Œ ์ข…์ข… BeanDefiniton๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ๊ทธ ๋•Œ ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค ์ฝ”๋“œ์ธ์ง€ ์ดํ•ด๋ฅผ ๋•๊ธฐ์œ„ํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•ด๋ณด์•˜๋‹ค.

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ