๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT/Spring

[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] ์ธํ”„๋Ÿฐ ๊ฐ•์˜ ์ •๋ฆฌ(์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์™€ ์Šคํ”„๋ง ๋นˆ - ๋‹ค์–‘ํ•œ ์„ค์ • ํ˜•์‹ ์ง€์›, BeanDefinition)

by YeonBu 2023. 10. 28.
728x90

/* ์ด ๊ธ€์€ ๊น€์˜ํ•œ๋‹˜์˜ ๊ฐ•์˜๋ฅผ ๋ณด๊ณ  ์ •๋ฆฌํ•˜๋ ค๊ณ  ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

   ๊ฐœ์ธ์ ์ธ ๊ณต๋ถ€๋ฅผ ์œ„ํ•ด ์˜ฌ๋ฆฌ๋Š” ๊ธ€์ด๋ฏ€๋กœ ์ค‘๊ฐ„ ์ค‘๊ฐ„ ์ฝ”๋“œ๋Š” ์ƒ๋žต๋˜์—ˆ์Šต๋‹ˆ๋‹ค. */

 

 

์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

์Šคํ”„๋ง ์ž…๋ฌธ์ž๊ฐ€ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๋ฉด์„œ ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์Šคํ”„๋ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํ™•์‹คํžˆ ๋‹ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., ์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์„ฑ์žฅํ•˜๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ณด์„ธ์š”! ๐Ÿ“ข

www.inflearn.com

 

 

 

 

 

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

 

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

(Java์ฝ”๋“œ, XML, Groovy ๋“ฑ)

 

 

 

1. ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ ์ž๋ฐ” ์ฝ”๋“œ ์„ค์ • ์‚ฌ์šฉ

 

โœ” ๊ฐ•์˜์—์„œ ์—ฌํƒœ๊นŒ์ง€ ์‚ฌ์šฉํ–ˆ๋˜ ์„ค์ • ๋ฐฉ์‹

AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

โœ” AnnotationConfigApplicationContext ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋ฐ” ์ฝ”๋“œ๋กœ๋œ ์„ค์ • ์ •๋ณด๋ฅผ ๋„˜๊ธฐ๋ฉด ๋œ๋‹ค.

 

 

 

 

2. XML ์„ค์ • ์‚ฌ์šฉ

 

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

 

 

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>

 

 

XmlAppContextTest

public class XmlAppContext {

    @Test
    void xmlAppContext() {
        ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml");
        MemberService memberService = ac.getBean("memberService", MemberService.class);
        Assertions.assertThat(memberService).isInstanceOf(MemberService.class);
    }

}

โœ” GenericXmlApplicationContext๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ xml ์„ค์ •ํŒŒ์ผ์„ ๋„˜๊ธด ํ›„ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰

 

 

 

 

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

 

 

1. BeanDefinition ์ด๋ž€?

 

โœ” ์Šคํ”„๋ง์ด ์ด๋Ÿฐ ๋‹ค์–‘ํ•œ ์„ค์ • ํ˜•์‹์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธ ์ค‘์‹ฌ์—๋Š” `BeanDefinition`์ด๋ผ๋Š” ์ถ”์ƒํ™”๊ฐ€ ์žˆ๋‹ค.

โœ” ์‰ฝ๊ฒŒ ์ด์•ผ๊ธฐํ•ด์„œ '์—ญํ• '๊ณผ '๊ตฌํ˜„'์„ ๊ฐœ๋…์ ์œผ๋กœ ๋‚˜๋ˆˆ๊ฒƒ.

โœ” ์œ„ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” BeanDefinition์—๋งŒ ์˜์กดํ•˜๊ณ  ์žˆ์Œ. ์ฆ‰ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์„ค์ •ํ˜•์‹์ด XML์ธ์ง€, ์ž๋ฐ”์ฝ”๋“œ์ธ์ง€ ๋ชฐ๋ผ๋„ ๋จ. ์„ค๊ณ„ ์ž์ฒด๋ฅผ ์ถ”์ƒํ™”์— ์˜์กดํ•˜๋„๋ก ํ•ด์„œ ์˜ค์ง BeanDefinition๋งŒ ์•Œ๋ฉด ๋จ. 

โœ” BeanDefinition์„ ๋นˆ ์„ค์ • ๋ฉ”ํƒ€ ์ •๋ณด๋ผ๊ณ  ํ•˜๋ฉฐ `@Bean`, `<bean>` ๋‹น ๊ฐ๊ฐ ํ•˜๋‚˜์”ฉ ๋ฉ”ํƒ€ ์ •๋ณด๊ฐ€ ์ƒ์„ฑ๋จ.

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

 

 

 

2. ์ฝ”๋“œ ๋ ˆ๋ฒจ๋กœ ์กฐ๊ธˆ ๋” ๊นŠ์ด ์žˆ๊ฒŒ

 

โœ” AnnotationConfigApplicationContext๋Š” AnnotatedBeanDefinitionReader(์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋นˆ ์ •์˜๋ฅผ ์ฝ๊ณ  ๋“ฑ๋กํ•˜๋Š” ์—ญํ• )๋ฅผ ์‚ฌ์šฉํ•ด์„œ AppConfig.class ๋ฅผ ์ฝ๊ณ  BeanDefinition ์„ ์ƒ์„ฑํ•œ๋‹ค. 

โœ” GenericXmlApplicationContext ๋Š” XmlBeanDefinitionReader(xml ํ˜•์‹์˜ ์„ค์ • ํŒŒ์ผ์„ ์ฝ๊ณ  ๋นˆ ์ •์˜๋ฅผ ๋“ฑ๋กํ•˜๋Š” ์—ญํ• ) ๋ฅผ ์‚ฌ์šฉํ•ด์„œ appConfig.xml ์„ค์ • ์ •๋ณด๋ฅผ ์ฝ๊ณ  BeanDefinition ์„ ์ƒ์„ฑํ•œ๋‹ค.

โœ” ํ•„์š”์— ๋”ฐ๋ผ ํ˜•์‹์— ์ƒ๊ด€์—†์ด XxxBeanDefinitionReader๋ฅผ ๋งŒ๋“ค์–ด์„œ BeanDefinition์„ ์ƒ์„ฑํ•˜๋ฉด ๋œ๋‹ค.

 

 

 

 

3. BeanDefinition ์ •๋ณด

 

 

BeanDefinitionTest

 

public class BeanDefinitionTest {

    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

    @Test
    @DisplayName("๋นˆ ์„ค์ • ๋ฉ”ํƒ€์ •๋ณด ํ™•์ธ")
    void findApplicationBean() {
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);

            if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){
                System.out.println("beanDefinitionName = " + beanDefinitionName + " / beanDefinition = " + beanDefinition);
            }
        }
    }

}

 

โœ” ์œ„์ฒ˜๋Ÿผ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋กœ๊ทธ์— BeanDefinition์ •๋ณด๊ฐ€ ๋œจ๋Š”๋ฐ ์ด๋ฅผ ์‚ดํŽด๋ณด์ž.

 

โ—พ BeanClassName : ์ƒ์„ฑํ•  ๋นˆ์˜ ํด๋ž˜์Šค ๋ช…(์ž๋ฐ” ์„ค์ •์ฒ˜๋Ÿผ ํŒฉํ† ๋ฆฌ ์—ญํ• ์˜ ๋นˆ์„ ์‚ฌ์šฉํ•˜๋ฉด ์—†์Œ)

โ—พ factoryBeanName : ํŒฉํ† ๋ฆฌ ์—ญํ• ์˜ ๋นˆ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ด๋ฆ„ (์˜ˆ, appConfig)

โ—พ factoryMethodName : ๋นˆ์„ ์ƒ์„ฑํ•  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ์ง€์ • (์˜ˆ, memberService)

โ—พ Scope : ์‹ฑ๊ธ€ํ†ค(๊ธฐ๋ณธ๊ฐ’)

โ—พ lazyInit  : ์Šคํ”„๋ง ๋นˆ์ด ์ƒ์„ฑ๋˜๋Š” ์‹œ์ ์„ ์ง€์—ฐ์‹œํ‚ค๋Š” ์„ค์ • ์˜ต์…˜. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ดˆ๊ธฐํ™” ๋  ๋•Œ ๋ชจ๋“  ๋นˆ์„ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•˜๋Š”๋ฐ, ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋ฉด ๋นˆ์ด ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ƒ์„ฑํ•˜๊ฒŒ ๋จ. 

โ—พ InitMethodName : ๋นˆ์„ ์ƒ์„ฑํ•˜๊ณ , ์˜์กด๊ด€๊ณ„๋ฅผ ์ ์šฉํ•œ ๋’ค์— ํ˜ธ์ถœ๋˜๋Š” ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ ๋ช…

โ—พ DestroyMethodName : ๋นˆ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ๋๋‚˜์„œ ์ œ๊ฑฐํ•˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ ๋ช…

โ—พ Constructor arguments, Properties : : ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์—์„œ ์‚ฌ์šฉํ•œ๋‹ค. (์ž๋ฐ” ์„ค์ • ์ฒ˜๋Ÿผ ํŒฉํ† ๋ฆฌ ์—ญํ• ์˜ ๋นˆ์„ ์‚ฌ์šฉ ํ•˜๋ฉด ์—†์Œ)

 

 

 

 

 

๋ฐ˜์‘ํ˜•

'IT > Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] ์ธํ”„๋Ÿฐ ๊ฐ•์˜ ์ •๋ฆฌ(์‹ฑ๊ธ€ํ†ค ์ปจํ…Œ์ด๋„ˆ - ์‹ฑ๊ธ€ํ†ค ์ปจํ…Œ์ด๋„ˆ, ์‹ฑ๊ธ€ํ†ค ๋ฐฉ์‹์˜ ์ฃผ์˜์ )  (0) 2023.10.30
[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] ์ธํ”„๋Ÿฐ ๊ฐ•์˜ ์ •๋ฆฌ(์‹ฑ๊ธ€ํ†ค ์ปจํ…Œ์ด๋„ˆ - ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์‹ฑ๊ธ€ํ†ค, ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด)  (0) 2023.10.30
[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] ์ธํ”„๋Ÿฐ ๊ฐ•์˜ ์ •๋ฆฌ(์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์™€ ์Šคํ”„๋ง ๋นˆ - BeanFactory์™€ ApplicationContext)  (0) 2023.10.28
[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] ์ธํ”„๋Ÿฐ ๊ฐ•์˜ ์ •๋ฆฌ(์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์™€ ์Šคํ”„๋ง ๋นˆ - ์Šคํ”„๋ง ๋นˆ ์กฐํšŒ ์‹œ ๋™์ผํ•œ ํƒ€์ž…์ด ๋‘˜ ์ด์ƒ, ์ƒ์† ๊ด€๊ณ„)  (1) 2023.10.28
[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] ์ธํ”„๋Ÿฐ ๊ฐ•์˜ ์ •๋ฆฌ(์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์™€ ์Šคํ”„๋ง ๋นˆ - ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก๋œ ๋ชจ๋“  ๋นˆ ์กฐํšŒ, ์Šคํ”„๋ง ๊ธฐ๋ณธ ๋นˆ ์กฐํšŒ)  (0) 2023.10.25