λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
IT/Spring

[μŠ€ν”„λ§ 핡심 원리 - 기본편] μΈν”„λŸ° κ°•μ˜ 정리(μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ™€ μŠ€ν”„λ§ 빈 - μŠ€ν”„λ§ 빈 쑰회 μ‹œ λ™μΌν•œ νƒ€μž…μ΄ λ‘˜ 이상, 상속 관계)

by YeonBu 2023. 10. 28.
728x90

/* 이 글은 κΉ€μ˜ν•œλ‹˜μ˜ κ°•μ˜λ₯Ό 보고 μ •λ¦¬ν•˜λ €κ³  μž‘μ„±ν•œ κΈ€μž…λ‹ˆλ‹€.

   κ°œμΈμ μΈ 곡뢀λ₯Ό μœ„ν•΄ μ˜¬λ¦¬λŠ” κΈ€μ΄λ―€λ‘œ 쀑간 쀑간 μ½”λ“œλŠ” μƒλž΅λ˜μ—ˆμŠ΅λ‹ˆλ‹€. */

 

 

μŠ€ν”„λ§ 핡심 원리 - 기본편 - μΈν”„λŸ° | κ°•μ˜

μŠ€ν”„λ§ μž…λ¬Έμžκ°€ 예제λ₯Ό λ§Œλ“€μ–΄κ°€λ©΄μ„œ μŠ€ν”„λ§μ˜ 핡심 원리λ₯Ό μ΄ν•΄ν•˜κ³ , μŠ€ν”„λ§ κΈ°λ³ΈκΈ°λ₯Ό ν™•μ‹€νžˆ λ‹€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€., μŠ€ν”„λ§ 핡심 원리λ₯Ό μ΄ν•΄ν•˜κ³ , μ„±μž₯ν•˜λŠ” λ°±μ—”λ“œ κ°œλ°œμžκ°€ λ˜μ–΄λ³΄μ„Έμš”! πŸ“’

www.inflearn.com

 

 

 

 

μŠ€ν”„λ§ 빈 쑰회 - λ™μΌν•œ νƒ€μž…μ΄ λ‘˜ 이상

 

 

ApplicationContextSameBeanFindTest

 

public class ApplicationContextSameBeanFindTest {

    //ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•΄ μ‚¬μš©ν•  클래슀 생성
    @Configuration
    static class SameBeanConfig {

        @Bean
        public MemberRepository memberRepository1() {
            return new MemoryMemberRepository();
        }

        @Bean
        public MemberRepository memberRepository2() {
            return new MemoryMemberRepository();
        }


    }

    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SameBeanConfig.class);

    @Test
    @DisplayName("νƒ€μž…μœΌλ‘œ μ‘°νšŒμ‹œ 같은 νƒ€μž…μ΄ λ‘˜ 이상 있으면, 쀑볡 였λ₯˜κ°€ λ°œμƒν•œλ‹€.")
    void findBeanByTypeDuplicate() {

        assertThrows(NoUniqueBeanDefinitionException.class, () -> ac.getBean(MemberRepository.class));

    }

    @Test
    @DisplayName("νƒ€μž…μœΌλ‘œ μ‘°νšŒμ‹œ 같은 νƒ€μž…μ΄ λ‘˜ 이상 있으면, 빈 이름을 μ§€μ •ν•˜λ©΄ λœλ‹€.")
    void findByName() {

        MemberRepository memberRepository = ac.getBean("memberRepository1", MemberRepository.class);
        assertThat(memberRepository).isInstanceOf(MemberRepository.class);

    }

    @Test
    @DisplayName("νŠΉμ • νƒ€μž…μ„ λͺ¨λ‘ μ‘°νšŒν•˜κΈ°")
    void findAllBeanType() {

        Map<String, MemberRepository> beansOfType = ac.getBeansOfType(MemberRepository.class);
        for (String key : beansOfType.keySet()) {
            System.out.println("key = " + key + " value = " + beansOfType.get(key));
        }
        System.out.println("beansOfType = " + beansOfType);
        assertThat(beansOfType.size()).isEqualTo(2);

    }
    
}

 

β—Ύ findBeanByTypeDuplicate

βœ” NoUniqueBeanDefinitionException : λ™μΌν•œ νƒ€μž…μ˜ 빈이 μ—¬λŸ¬ 개 등둝 된 경우 μ˜ˆμ™Έ λ°œμƒ

βœ” MemberRepository μœ ν˜•μ˜ λ™μΌν•œ 빈이 μžˆλŠ” 경우 ν…ŒμŠ€νŠΈ 성곡

 

 

β—Ύ findByName

βœ” λ™μΌν•œ νƒ€μž…μ˜ 빈이 μ—¬λŸ¬κ°œλΌλ©΄ 빈 이름을 μ§€μ •ν•˜μ—¬ ν˜Όλž€μ„ ν•΄κ²°ν•œλ‹€

 

 

β—Ύ findAllBeanType

βœ” getBeansOfType() : νŠΉμ •νƒ€μž…(클래슀 or μΈν„°νŽ˜μ΄μŠ€)에 ν•΄λ‹Ήν•˜λŠ” λͺ¨λ“  λΉˆμ„ κ²€μƒ‰ν•˜κ³  맡 ν˜•νƒœλ‘œ λ°˜ν™˜

βœ” 맡의 ν‚€λŠ” 빈 이름, 값은 ν•΄λ‹Ή 빈의 μΈμŠ€ν„΄μŠ€

βœ” keySet() : Map의 λ©”μ„œλ“œ 쀑 ν•˜λ‚˜λ‘œ Map에 λͺ¨λ“  keyλ₯Ό κ°€μ Έμ˜€λŠ” 데 μ‚¬μš©.

 

 

 

 

 

μŠ€ν”„λ§ 빈 쑰회 - 상속 관계

 

ApplicationContextExtendsFindTest

 

public class ApplicationContextExtendsFindTest {

    //ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•΄ μ‚¬μš©ν•  클래슀 생성
    @Configuration
    static class TestConfig {

        @Bean
        public DiscountPolicy rateDiscountPolicy() {
            return new RateDiscountPolicy();
        }

        @Bean
        public DiscountPolicy fixDiscountPolicy(){
            return new FixDiscountPolicy();
        }

    }

    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class);

    @Test
    @DisplayName("λΆ€λͺ¨ νƒ€μž„μœΌλ‘œ μ‘°νšŒμ‹œ, μžμ‹μ΄ λ‘˜ 이상 있으면 쀑볡 였λ₯˜κ°€ λ°œμƒν•œλ‹€")
    void findBeanByParentTypeDuplicate() {

        assertThrows(NoUniqueBeanDefinitionException.class, () -> ac.getBean(DiscountPolicy.class));

    }

    @Test
    @DisplayName("λΆ€λͺ¨ νƒ€μž„μœΌλ‘œ μ‘°νšŒμ‹œ, μžμ‹μ΄ λ‘˜ 이상 있으면 빈 이름을 μ§€μ •ν•˜λ©΄ λœλ‹€.")
    void findBeanByParentTypeBeanName() {

        DiscountPolicy rateDiscountPolicy = ac.getBean("rateDiscountPolicy", DiscountPolicy.class);
        assertThat(rateDiscountPolicy).isInstanceOf(RateDiscountPolicy.class);

    }

    @Test
    @DisplayName("νŠΉμ • ν•˜μœ„ νƒ€μž…μœΌλ‘œ 쑰회.")
    void findBeanBySubType() {

        RateDiscountPolicy bean = ac.getBean(RateDiscountPolicy.class);
        assertThat(bean).isInstanceOf(RateDiscountPolicy.class);

    }

    @Test
    @DisplayName("λΆ€λͺ¨ νƒ€μž…μœΌλ‘œ λͺ¨λ‘ 쑰회회.")
    void findAllBeanByParentType() {

        Map<String, DiscountPolicy> beansOfType = ac.getBeansOfType(DiscountPolicy.class);
        assertThat(beansOfType.size()).isEqualTo(2);
        for (String key : beansOfType.keySet()) {
            System.out.println("key = " + key + " value = " + beansOfType.get(key));
        }

    }

    @Test
    @DisplayName("λΆ€λͺ¨ νƒ€μž…μœΌλ‘œ λͺ¨λ‘ μ‘°νšŒν•˜κΈ° - Object")
    void findAllBeanByObjectType() {

        Map<String, Object> beansOfType = ac.getBeansOfType(Object.class);
        for (String key : beansOfType.keySet()) {
            System.out.println("key = " + key + " value = " + beansOfType.get(key));
        }

    }

}

 

β—Ύ λ‚˜λ¨Έμ§€λŠ” μ „ μ‹œκ°„μ— ν•΄λ³Έ 것듀.

 

β—Ύ findAllBeanByObjectType

βœ” λΆ€λͺ¨ νƒ€μž„μœΌλ‘œ μ‘°νšŒν•˜λ©΄ μžμ‹ νƒ€μž…

βœ” μžλ°” 객체의 졜고 λΆ€λͺ¨μΈ Object νƒ€μž…μœΌλ‘œ μ‘°νšŒν•˜λ©΄ λͺ¨λ“  μŠ€ν”„λ§ λΉˆμ„ μ‘°νšŒν•œλ‹€.

βœ” ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•˜λ©΄ TestConfig.class의 빈 뿐만 μ•„λ‹ˆλΌ μŠ€ν”„λ§μ—μ„œ λ‚΄λΆ€μ μœΌλ‘œ μ“°λŠ” λΉˆκΉŒμ§€ λ‹€ 좜λ ₯λœλ‹€.

 

 

λ°˜μ‘ν˜•