Development/Spring Boot

[Spring Boot] 스프링 빈 조회 (3) 동일한 타입이 둘 이상

sky Jeong 2022. 8. 14. 18:49

1- 스프링 빈 조회

  • 타입으로 조회시 같은 타입의 스프링 빈이 둘 이상이면 오류가 발생함. 
    --> 이때는 빈 이름 지정 필요. @Bean (name = "beanName" )

  • annotcationConfigApplicationContext.getBeansOfType( )
    --> 이를 사용해 해당 타입의 모든 빈 조회 가능

2- 타입으로 조회하는 경우 - 테스트 코드 예시

 

(1) 테스트시 생성되는 ApplicationContext를 달리하기 위해 해당 코드 내에 Config 클래스를 만듦

(2) 테스트 코드로 실행한 결과 동일 타입의 Bean이 중복으로 조회되어 NoUniueBeanDefinitionException 에러 발생

[ 수정 ]

 

    @Test
    @DisplayName("타입으로 조회시 같은 타입이 둘 이상 있으면, 중복 오류가 발생한다")
    void findBeanByTypeDuplicate() {

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

    }

- 위 사용된 문법은 자바 8의 람다식(Lamda)

- assertThrows로 넘겨준 Exception이 발생하면 테스트 성공


3- 타입으로 조회시 같은 타입이 둘 이상 있을 경우 빈 이름으로 조회 - 테스트 코드 예시

@Test
@DisplayName("타입으로 조회시 같은 타입이 둘 이상 있으면, 빈 이름을 지정하면 된다")
void findBeanByName() {

    // 단순히 객체 클래스 타입만 넘겨서 조회하면 에러가 발생하였는데, 하기와 같이 멤버 이름을 지정해 받는다면 오류가 발생하지 않음
    MemberRepository memberRepository = ac.getBean("memberRepository1", MemberRepository.class);
    assertThat(memberRepository).isInstanceOf(MemberRepository.class);

}

4- 특정 타입 모두 조회하기 - 테스트 코드

// 만약 동일 타입의 Bean을 모두 꺼내고 싶은 경우
@Test
@DisplayName("특정 타입을 모두 조회하기")
void findAllBeanByType(){

    // 동일 타입들을 모두 갖고 오고 싶다면 getBeansOfType으로 가져오면 됨
    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);

}