/* ์ด ๊ธ์ ๊น์ํ๋์ ๊ฐ์๋ฅผ ๋ณด๊ณ ์ ๋ฆฌํ๋ ค๊ณ ์์ฑํ ๊ธ์ ๋๋ค.
๊ฐ์ธ์ ์ธ ๊ณต๋ถ๋ฅผ ์ํด ์ฌ๋ฆฌ๋ ๊ธ์ด๋ฏ๋ก ์ค๊ฐ ์ค๊ฐ ์ฝ๋๋ ์๋ต๋์์ต๋๋ค. */
๋ค์ํ ์ค์ ํ์ ์ง์ - ์๋ฐ ์ฝ๋, 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 : : ์์กด๊ด๊ณ ์ฃผ์ ์์ ์ฌ์ฉํ๋ค. (์๋ฐ ์ค์ ์ฒ๋ผ ํฉํ ๋ฆฌ ์ญํ ์ ๋น์ ์ฌ์ฉ ํ๋ฉด ์์)