Spring

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

์กฐ๋ฐˆ๋ฐ 2022. 4. 12. 10:49

๐Ÿ’ก ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ

: ApplicationContext ๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ผ ํ•˜๋ฉฐ, ์ธํ„ฐํŽ˜์ด์Šค๋‹ค

: ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” XML์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ , ์• ๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์˜ ์ž๋ฐ” ์„ค์ • ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค

 

AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);

* ์ž๋ฐ” ์„ค์ • ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ApplicationContext ๋งŒ๋“ค๊ธฐ

 -> new AnnotationConfigApplicationContext(AppConfig.class);

 -> ์ด ํด๋ž˜์Šค๋Š” ApplicationContext ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด์ด๋‹ค.

 

* ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๊ตฌ์„ฑ ์ •๋ณด๋ฅผ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค

=> AppConfig.class๋ฅผ ๊ตฌ์„ฑ์ •๋ณด๋กœ ์ง€์ •ํ–ˆ๋‹ค

 

๐Ÿ’ก ์Šคํ”„๋ง ๋นˆ ๋“ฑ๋ก

โ˜ž ๋นˆ ์ด๋ฆ„ : ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•œ๋‹ค

              : ์ง์ ‘ ๋ถ€์—ฌํ•œ๋‹ค @Bean(name="memberService2")

              : ํ•ญ์ƒ ๋‹ค๋ฅธ ์ด๋ฆ„์„ ๋ถ€์—ฌํ•ด์•ผ ํ•œ๋‹ค (์ค‘๋ณตX)

=> ๋ฐ˜ํ™˜๋œ ๊ฐ์ฒด๊ฐ€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์ด๋ฆ„๊ณผ ํ•จ๊ป˜ ๋“ฑ๋ก๋œ๋‹ค

 

๐Ÿ”Ž ์Šคํ”„๋ง์€ ๋นˆ์„ ์ƒ์„ฑํ•˜๊ณ , ์˜์กด๊ด€๊ณ„๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๋‹จ๊ณ„๊ฐ€ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค

-> ๊ทธ๋Ÿฐ๋ฐ ์ด๋ ‡๊ฒŒ ์ž๋ฐ” ์ฝ”๋“œ๋กœ ์Šคํ”„๋ง ๋นˆ์„ ๋“ฑ๋กํ•˜๋ฉด ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…๋„ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌ๋œ๋‹ค

 

๐Ÿ’ก ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก๋œ ๋ชจ๋“  ๋นˆ ์กฐํšŒ

public class ApplicationContextInfoTest {

    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

    @Test
    @DisplayName("๋ชจ๋“  ๋นˆ ์ถœ๋ ฅํ•˜๊ธฐ")
    void findAllBean() {
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            Object bean = ac.getBean(beanDefinitionName);
            System.out.println("name = " + beanDefinitionName + ", object = " + bean);
        }
    }

    @Test
    @DisplayName("์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นˆ ์ถœ๋ ฅํ•˜๊ธฐ")
    void findApplicationBean() {
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
            // Role ROLE_APPLICATION : ์ง์ ‘ ๋“ฑ๋กํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นˆ
            // Role ROLE_INFRASTRUCTURE : ์Šคํ”„๋ง์ด ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋นˆ
            if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
                Object bean = ac.getBean(beanDefinitionName);
                System.out.println("name = " + beanDefinitionName + ", object = " + bean);
            }
        }
    }
}

๐Ÿ”Ž ๋ชจ๋“  ๋นˆ ์ถœ๋ ฅํ•˜๊ธฐ

- ac.getBeanDefinitionNames() : ์Šคํ”„๋ง์— ๋“ฑ๋ก๋œ ๋ชจ๋“  ๋นˆ ์ด๋ฆ„์„ ์กฐํšŒ

- ac.getBean() : ๋นˆ ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)๋ฅผ ์กฐํšŒ

๐Ÿ”Ž ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นˆ ์ถœ๋ ฅํ•˜๊ธฐ <- ๋‚ด๊ฐ€ ๋“ฑ๋กํ•œ ๋นˆ๋งŒ ์ถœ๋ ฅํ•ด๋ณด์ž

- getRole()๋กœ ๊ตฌ๋ถ„

  ROLE_APPLICATION : ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ๋นˆ

  ROLE_INFRASTRUCTURE : ์Šคํ”„๋ง์ด ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋นˆ

 

๐Ÿ’ก ์Šคํ”„๋ง ๋นˆ ์กฐํšŒ

๐Ÿ”Ž ๊ธฐ๋ณธ์ ์ธ ์กฐํšŒ ๋ฐฉ๋ฒ•

- ac.getBean(๋นˆ์ด๋ฆ„, ํƒ€์ž…)

- ac.getBean(ํƒ€์ž…)

โ—๏ธ ์กฐํšŒ ๋Œ€์ƒ ์Šคํ”„๋ง ๋นˆ์ด ์—†์œผ๋ฉด ์˜ˆ์™ธ ๋ฐœ์ƒ

 -> NoSuchBeanDefinitionException: No bean named 'xxxxx' available

 

๐Ÿ”Ž ๋™์ผํ•œ ํƒ€์ž…์ด ๋‘˜ ์ด์ƒ ์กฐํšŒ

- ํƒ€์ž…์œผ๋กœ ์กฐํšŒ์‹œ ๊ฐ™์€ ํƒ€์ž…์˜ ์Šคํ”„๋ง ๋นˆ์ด ๋‘˜ ์ด์ƒ์ด๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค => ๋นˆ ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ž

- ac.getBeansOfType() : ํ•ด๋‹น ํƒ€์ž…์˜ ๋ชจ๋“  ๋นˆ์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค

 

๐Ÿ’ก ์Šคํ”„๋ง ๋นˆ ์กฐํšŒ - ์ƒ์† ๊ด€๊ณ„

: ๋ถ€๋ชจ ํƒ€์ž…์œผ๋กœ ์กฐํšŒํ•˜๋ฉด, ์ž์‹ ํƒ€์ž…๋„ ํ•จ๊ป˜ ์กฐํšŒํ•œ๋‹ค

: ๊ทธ๋ž˜์„œ ๋ชจ๋“  ์ž๋ฐ” ๊ฐ์ฒด์˜ ์ตœ๊ณ  ๋ถ€๋ชจ์ธ object ํƒ€์ž…์œผ๋กœ ์กฐํšŒํ•˜๋ฉด, ๋ชจ๋“  ์Šคํ”„๋ง ๋นˆ์„ ์กฐํšŒํ•œ๋‹ค

 

๐Ÿ’ก BeanFactory์™€ ApplicationContext

๐Ÿ”Ž BeanFactory

- ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ตœ์ƒ์œ„ ์ธํ„ฐํŽ˜์ด์Šค

- ์Šคํ”„๋ง ๋นˆ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์กฐํšŒํ•˜๋Š” ์—ญํ•  ๋‹ด๋‹น

- getBean()์„ ์ œ๊ณตํ•œ๋‹ค

 

๐Ÿ”Ž ApplicationContext

- BeanFactory ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ์ƒ์†๋ฐ›์•„์„œ ์ œ๊ณตํ•œ๋‹ค

- ๋นˆ ๊ด€๋ฆฌ + ํŽธ๋ฆฌํ•œ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค

- ๋ถ€๊ฐ€๊ธฐ๋Šฅ์ด ํฌํ•จ๋œ ApplicationContext๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค

 

* BeanFactory๋‚˜ ApplicationContext๋ฅผ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ  ํ•œ๋‹ค

 

๐Ÿ’ก ๋‹ค์–‘ํ•œ ์„ค์ • ํ˜•์‹ ์ง€์› - ์ž๋ฐ” ์ฝ”๋“œ, XML

- ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ๋‹ค์–‘ํ•œ ํ˜•์‹์˜ ์„ค์ • ์ •๋ณด๋ฅผ ๋ฐ›์•„๋“œ๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ์œ ์—ฐํ•˜๊ฒŒ ์„ค๊ณ„๋˜์–ด ์žˆ๋‹ค

- ์ž๋ฐ” ์ฝ”๋“œ, XML, Groovy ๋“ฑ

๐Ÿ”Ž XML ์„ค์ • ์‚ฌ์šฉ

- GenericXmlApplicationContext๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ xml์„ค์ • ํŒŒ์ผ์„ ๋„˜๊ธฐ๋ฉด ๋œ๋‹ค

 

src/main/resources/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://www.springframework.org/schema/beans/spring-beans.xsd">

    <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>

* ์ž๋ฐ” ํŒŒ์ผ์ด ์•„๋‹Œ ๋ชจ๋“ ๊ฒƒ์€ resources์— ์ž‘์„ฑ

 

๐Ÿ’ก ์Šคํ”„๋ง ๋นˆ ์„ค์ • ๋ฉ”ํƒ€ ์ •๋ณด - BeanDefinition

- ์Šคํ”„๋ง์ด ๋‹ค์–‘ํ•œ ์„ค์ • ํ˜•์‹์„ ์ง€์›ํ•˜๋Š”๊ฒƒ์€ -> ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๊ฐœ๋…์ ์œผ๋กœ ๋‚˜๋ˆ„์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค

ex) XML์„ ์ฝ์–ด์„œ BeanDefinition์„ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค

    ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์ฝ์–ด์„œ BeanDefinition์„ ๋งŒ๋“ค๋ฉด๋œ๋‹ค

    -> ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ๋ฌด์—‡์ธ์ง€ ๋ชฐ๋ผ๋„ ์˜ค์ง BeanDefinition๋งŒ ์•Œ๋ฉด๋œ๋‹ค

- BeanDefinition : ๋นˆ ์„ค์ • ๋ฉ”ํƒ€์ •๋ณด

- ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์ด ๋ฉ”ํƒ€์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์Šคํ”„๋ง ๋นˆ์„ ์ƒ์„ฑํ•œ๋‹ค

* ์Šคํ”„๋ง์ด ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ์„ค์ • ์ •๋ณด๋ฅผ BeanDefinition์œผ๋กœ ์ถ”์ƒํ™”ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค