์คํ๋ง ์ปจํ ์ด๋์ ์คํ๋ง ๋น
๐ก ์คํ๋ง ์ปจํ ์ด๋ ์์ฑ
: 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์ผ๋ก ์ถ์ํํด์ ์ฌ์ฉํ๋ค