[Spring] ํ•ต์‹ฌ ์›๋ฆฌ ๊ธฐ๋ณธ (4) - ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์™€ ์Šคํ”„๋ง ๋นˆ

2022. 3. 13. 18:50ยทSpring

๐Ÿ“Œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ

//์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ
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
'Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Spring] ํ•ต์‹ฌ ์›๋ฆฌ ๊ธฐ๋ณธ (6) - ์ปดํฌ๋„ŒํŠธ ์Šค์บ”
  • [Spring] ํ•ต์‹ฌ ์›๋ฆฌ ๊ธฐ๋ณธ (5) - ์‹ฑ๊ธ€ํ†ค ์ปจํ…Œ์ด๋„ˆ
  • [Spring] ํ•ต์‹ฌ ์›๋ฆฌ ๊ธฐ๋ณธ (3) - ๊ฐ์ฒด ์ง€ํ–ฅ ์›๋ฆฌ ์ ์šฉ
  • [Spring] ํ•ต์‹ฌ ์›๋ฆฌ ๊ธฐ๋ณธ (2) - ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ ๋งŒ๋“ค๊ธฐ
Sue
Sue
๊ฐœ๋ฐœ ๊ณต๋ถ€ ๋กœ๊ทธ
  • Sue
    Sue's devlog
    Sue
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (122)
      • Algorithm (2)
      • WEB (8)
      • Java & Kotlin (83)
      • Spring (26)
      • Database (1)
      • Infra (0)
      • Git (1)
      • devlog (1)
  • ์ธ๊ธฐ ๊ธ€

  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
Sue
[Spring] ํ•ต์‹ฌ ์›๋ฆฌ ๊ธฐ๋ณธ (4) - ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์™€ ์Šคํ”„๋ง ๋นˆ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”