๐ ์คํ๋ง ์ปจํ ์ด๋
//์คํ๋ง ์ปจํ
์ด๋ ์์ฑ
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
- ApplicationContext : ์คํ๋ง ์ปจํ ์ด๋ (์ธํฐํ์ด์ค)
- AnnotationConfigApplicationContext : ApplicationContext ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด
- ์คํ๋ง ์ปจํ ์ด๋๋ XML ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค ์ ์๊ณ , ์ ๋ ธํ ์ด์ ๊ธฐ๋ฐ์ ์๋ฐ ์ค์ ํด๋์ค๋ก ๋ง๋ค ์ ์์
- XML ๊ธฐ๋ฐ ์ปจํ ์ด๋๋ ์ ์ฌ์ฉํ์ง ์๊ณ ์ ๋ ธํ ์ด์ ๊ธฐ๋ฐ์ ์๋ฐ ์ค์ ํด๋์ค๊ฐ๋ง์ด ์ฌ์ฉ๋จ
๐ ์คํ๋ง ์ปจํ ์ด๋์ ์์ฑ ๊ณผ์
1๏ธโฃ ์คํ๋ง ์ปจํ ์ด๋ ์์ฑ
- ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์์ฑํ ๋๋ ๊ตฌ์ฑ ์ ๋ณด๋ฅผ ์ง์ ํด์ฃผ์ด์ผ ํจ
2๏ธโฃ ์คํ๋ง ๋น ๋ฑ๋ก
- ์คํ๋ง ์ปจํ ์ด๋๋ ํ๋ผ๋ฏธํฐ๋ก ๋์ด์จ ์ค์ ํด๋์ค ์ ๋ณด๋ฅผ ์ฌ์ฉํด์ ์คํ๋ง ๋น์ ๋ฑ๋ก
- ๋น ์ด๋ฆ์ ์ค์ ํด๋์ค์ ๋ฉ์๋ ์ด๋ฆ์ ์ฌ์ฉํ๊ณ , ๋น ์ด๋ฆ์ ์ง์ ๋ถ์ฌํ ์๋ ์๋ค. @Bean(name=" ")
- ๊ฐ ๋ฉ์๋๊ฐ ๋ฐํํ๋ ์ธ์คํด์ค๋ ๋น ๊ฐ์ฒด๋ก ์ ์ฅ๋๋ค.
3๏ธโฃ ์คํ๋ง ๋น ์์กด๊ด๊ณ ์ค์
- ์คํ๋ง ์ปจํ ์ด๋๋ ์ค์ ์ ๋ณด๋ฅผ ์ฐธ๊ณ ํด์ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ (DI)ํ๋ค.
โป์ฐธ๊ณ โป : ์คํ๋ง ๋น์ ์์ฑํ๊ณ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ๋ ๊ณผ์ ์ ๋๋์ด์ ธ์์ง๋ง ์์ฑ์๋ฅผ ํตํด ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ ๋๋ ํ๋ฒ์ ์ฒ๋ฆฌ๋๋ค.
๐ ์ปจํ ์ด๋์ ๋ฑ๋ก๋ ๋น ์กฐํํ๊ธฐ
@Test
@DisplayName("์ ์ฒด ๋น ์กฐํํ๊ธฐ")
void findAllBean() { // ๋ชจ๋ ๋น ์กฐํ
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
Object bean = ac.getBean(beanDefinitionName);
System.out.println("name = " + beanDefinitionName+ "bean = " + bean);
}
}
@Test
@DisplayName("์ง์ ๋ฑ๋กํ ์ ํ๋ฆฌ์ผ์ด์
๋น ์กฐํ")
void findApplicationBean() {
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
Object bean = ac.getBean(beanDefinitionName);
System.out.println("name = " + beanDefinitionName + "bean = " + bean);
}
}
- ๋ชจ๋ ๋น ์ถ๋ ฅํ๊ธฐ
- ์คํํ๋ฉด ์ง์ ๋ฑ๋กํ ์ ํ๋ฆฌ์ผ์ด์ ๋น์ ํฌํจํด์ ์คํ๋ง์ ๋ฑ๋ก๋ ๋ชจ๋ ๋น ์ ๋ณด๋ฅผ ์ถ๋ ฅํ ์ ์์
- ac.getBeanDefinitionNames() : ์คํ๋ง์ ๋ฑ๋ก๋ ๋ชจ๋ ๋น ์ด๋ฆ์ ์กฐํ
- ac.getBean() : ๋น ์ด๋ฆ์ผ๋ก ๋น ๊ฐ์ฒด๋ฅผ ์กฐํ
- ์ ํ๋ฆฌ์ผ์ด์
๋น ์ถ๋ ฅํ๊ธฐ
- getRole() ๋ฉ์๋๋ก ๋น ๊ตฌ๋ถ
- ROLE_APPLICATION : ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ์ ์ํ ๋น
- ROLE_INFRASTRUCTURE : ์คํ๋ง์ด ๋ด๋ถ์์ ์ฌ์ฉํ๋ ๋น
๐ ์คํ๋ง ๋น ์กฐํ
- ac.getBean(๋น ์ด๋ฆ, ํ์ )
- ac.getBean(ํ์ )
- ์กฐํ ๋์ ์คํ๋ง ๋น์ด ์์ผ๋ฉด NoSuchBeanDefinitionException ๋ฐ์
- ๊ตฌ์ฒด ํ์ ์ผ๋ก ์กฐํํ๋ฉด ๋ณ๊ฒฝ์ ์ ์ฐ์ฑ์ด ๋จ์ด์ง ์ ์์
โ ๋์ผํ ํ์ ์ด ๋ ์ด์์ผ๋ ์กฐํ
public class ApplicationSameBeanFindTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SameBeanConfig.class);
@Test
@DisplayName("๋น ์กฐํ์ ๊ฐ์ ํ์
์ด ๋ ์ด์ ์์๋ ํ์
์ผ๋ก ์กฐํํ๋ฉด ์ค๋ณต ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.")
void findBeanByTypeDuplicate() {
// MemberRepository bean = ac.getBean(MemberRepository.class); ์ค๋ฅ
Assertions.assertThrows(NoUniqueBeanDefinitionException.class, () -> ac.getBean(MemberRepository.class));
}
@Test
@DisplayName("๋น ์กฐํ์ ๊ฐ์ ํ์
์ด ๋ ์ด์ ์์ผ๋ฉด ๋น ์ด๋ฆ์ผ๋ก ์กฐํํ๋ฉด ๋๋ค.")
void findBeanByName() {
MemberRepository bean = ac.getBean("memberRepository1",MemberRepository.class);
assertThat(bean).isInstanceOf(MemberRepository.class);
}
@Test
@DisplayName("ํน์ ํ์
์ ๋ชจ๋ ์กฐํํ๊ธฐ")
void findAllBeanByType() {
Map<String, MemberRepository> beansOfType = ac.getBeansOfType(MemberRepository.class);
for (String key : beansOfType.keySet()) {
Object bean = ac.getBean(key);
System.out.println("key = " + key + " value = " + beansOfType.get(key));
}
}
@Configuration
static class SameBeanConfig {
@Bean
public MemberRepository memberRepository1() {
return new MemoryMemberRepository();
}
@Bean
public MemberRepository memberRepository2() {
return new MemoryMemberRepository();
}
}
}
- ํ์ ์ผ๋ก ์กฐํ ์ ๊ฐ์ ํ์ ์ ์คํ๋ง ๋น์ด ๋ ์ด์์ด๋ฉด ์ค๋ฅ ๋ฐ์, ๋น ์ด๋ฆ ์ง์ ํ์
- ac.getBeansOfType()์ ์ฌ์ฉํ๋ฉด ํด๋น ํ์ ์ ๋ชจ๋ ๋น ์กฐํ
โ ์์ ๊ด๊ณ
@Test
@DisplayName("Object ํด๋์ค๋ก ๋น ์กฐํํ๊ธฐ")
void findBeanByObject() {
Map<String, Object> beansOfType = ac.getBeansOfType(Object.class);
for (String key : beansOfType.keySet()) {
Object bean = ac.getBean(key);
System.out.println("key = " + key + " value = " + beansOfType.get(key));
}
}
- ๋ถ๋ชจ ํ์ ์ผ๋ก ์กฐํํ๋ฉด ์์ ํ์ ๋ ํจ๊ป ์กฐํ
- ์๋ฐ ๊ฐ์ฒด์ ์ต์์ ๊ฐ์ฒด์ธ Object ํ์ ์ผ๋ก ์กฐํํ๋ฉด ๋ชจ๋ ์คํ๋ง ๋น์ ์กฐํ
๐ BeanFactory์ ApplicationContext
โ BeanFactory
- ์คํ๋ง ์ปจํ ์ด๋์ ์ต์์ ์ธํฐํ์ด์ค
- ์คํ๋ง ๋น์ ๊ด๋ฆฌํ๊ณ ์กฐํํ๋ ์ญํ
- getBean()์ ์ ๊ณต
โ ApplicationContext
- BeanFactory ๊ธฐ๋ฅ์ ๋ชจ๋ ์์๋ฐ์ ์ ๊ณต + ๋ถ๊ฐ๊ธฐ๋ฅ
- ๋ฉ์ธ์ง์์ค๋ฅผ ํ์ฉํ ๊ตญ์ ํ ๊ธฐ๋ฅ : ํ๊ตญ์์ ๋ค์ด์ค๋ฉด ํ๊ตญ์ด, ์์ด๊ถ์์ ๋ค์ด์ค๋ฉด ์์ด๋ก ์ถ๋ ฅ
- ํ๊ฒฝ๋ณ์ : ๋ก์ปฌ, ๊ฐ๋ฐ, ์ด์ ๋ฑ์ ๊ตฌ๋ถํด์ ์ฒ๋ฆฌ
- ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฒคํธ : ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๊ณ ๊ตฌ๋ ํ๋ ๋ชจ๋ธ์ ํธ๋ฆฌํ๊ฒ ์ง์
- ํธ๋ฆฌํ ๋ฆฌ์์ค ์กฐํ : ํ์ผ, ํด๋์คํจ์ค, ์ธ๋ถ ๋ฑ์์ ๋ฆฌ์์ค๋ฅผ ํธ๋ฆฌํ๊ฒ ์กฐํ
๐ ๋ค์ํ ์ค์ ํ์์ ์ง์ํ๋ ์คํ๋ง ์ปจํ ์ด๋
- ์ ๋ ธํ ์ด์ ๊ธฐ๋ฐ ์๋ฐ ์ฝ๋ ์ค์ : ์๋ฐ ์ฝ๋๋ก ๋ ์ค์ ์ ๋ณด๋ฅผ ๋๊ธฐ๋ฉด ๋จ (AppConfig)
- XML ์ค์ : ์ปดํ์ผ ์์ด ๋น ์ค์ ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ ์ ์์ (์ต๊ทผ ์คํ๋ง ๋ถํธ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ฉด์ XML ๊ธฐ๋ฐ์ ์ค์ ์ ์ ์ฌ์ฉํ์ง ์์)
- ๋ค๋ฅธ ํ์์ผ๋ก๋ ํ์ฅํด์ ์ฌ์ฉํ ์ ์์
๐ ์คํ๋ง ๋น ๋ฉํ ์ ๋ณด - BeanDefinition
- ์คํ๋ง์ ์ญํ ๊ณผ ๊ตฌํ์ ๊ฐ๋ ์ ์ผ๋ก ๋๋์ด ๋์๊ธฐ ๋๋ฌธ์ ๋ค์ํ ์ค์ ํ์์ ์ง์
- ์คํ๋ง ์ปจํ ์ด๋๋ ์ค์ ์ ๋ณด๊ฐ ์๋ฐ ์ฝ๋์ธ์ง, XML์ธ์ง๋ ๋ชฐ๋ผ๋ ๋จ, ์ค์ง BeanDefinition๋ง ์๋ฉด๋จ
- BeanDefinition : ๋น ์ค์ ๋ฉํ ์ ๋ณด, ๊ฐ ๋น๋น ํ๋์ฉ ๋ฉํ ์ ๋ณด๊ฐ ์์ฑ๋จ
- ์คํ๋ง ์ปจํ ์ด๋๋ ์ด ๋ฉํ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์คํ๋ง ๋น์ ์์ฑ
- AnnotationConfigApplicationContext๋ AnnotatedBeanDefinitionReader๋ฅผ ์ฌ์ฉํด์ ์ค์ ์ ๋ณด๋ฅผ ์ฝ์ด BeanDefinition์ ์์ฑํ๋ค.
- ์๋ก์ด ํ์์ ์ค์ ์ ๋ณด๊ฐ ์ถ๊ฐ๋๋ฉด ์๋ก์ด BeanDefinitionReader๋ฅผ ๋ง๋ค์ด์ BeanDefinition์ ์์ฑํด ์ฃผ๋ฉด ๋๋ค.
- ํ์ง๋ง ์ค๋ฌด์์ BeanDefinition์ ์ง์ ์ ์ํ๊ฑฐ๋ ์ฌ์ฉํ ์ผ์ ๊ฑฐ์ ์๋ค.
- ์คํ๋ง์ด ๋ค์ํ ํํ์ ์ค์ ์ ๋ณด๋ฅผ BeanDefinition์ผ๋ก ์ถ์ํํด์ ์ฌ์ฉํ๋ ๊ฒ๋ง ์ดํดํ์!
๊ฐ์ ๋งํฌ
์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ - ์ธํ๋ฐ | ๊ฐ์
์คํ๋ง ์ ๋ฌธ์๊ฐ ์์ ๋ฅผ ๋ง๋ค์ด๊ฐ๋ฉด์ ์คํ๋ง์ ํต์ฌ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ , ์คํ๋ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํ์คํ ๋ค์ง ์ ์์ต๋๋ค., - ๊ฐ์ ์๊ฐ | ์ธํ๋ฐ...
www.inflearn.com
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] ํต์ฌ ์๋ฆฌ ๊ธฐ๋ณธ (5) - ์ฑ๊ธํค ์ปจํ ์ด๋ (0) | 2022.03.13 |
---|---|
[Spring] ํต์ฌ ์๋ฆฌ ๊ธฐ๋ณธ (3) - ๊ฐ์ฒด ์งํฅ ์๋ฆฌ ์ ์ฉ (0) | 2022.03.12 |
[Spring] ํต์ฌ ์๋ฆฌ ๊ธฐ๋ณธ (2) - ์์ ํ๋ก๊ทธ๋จ ๋ง๋ค๊ธฐ (0) | 2022.03.12 |