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);
}