반응형
이전 글에서 하나의 객체에 빈을 주입해야 하는데 조회한 빈(Bean)이 2개 이상일 경우 @Autowired 필드 명 매칭, @Qualifier, @Primary 3가지 방법을 통해 해결한다고 공부하였다.
그렇다면 조회한 빈이 모두 필요하다면 어떻게 해야 할까? 이는 Map이나 List 같은 자료구조를 활용하여 해결할 수 있다.
우선 테스트하기 쉽도록 두 종류의 Repository를 빈으로 등록해주는 AutoConfig 클래스를 하나 구현하자.
@Configuration
public class AutoConfig {
@Bean
public MyRepository jpaRepository() {
return new JpaRepository();
}
@Bean
public MyRepository memoryRepository() {
return new MemoryRepository();
}
}
각각의 Repository는 MyRepository 인터페이스를 구현한 상태이다.
public interface MyRepository {
}
@Repository
public class MemoryRepository implements MyRepository{
}
@Repository
public class JpaRepository implements MyRepository{
}
Map 자료구조에 key 값으로 빈의 이름을 value 값으로 MyRepository 타입의 두 객체를 넣어준다. 구현 클래스가 아닌 추상화된 인터페이스로 Map을 선언하였기 때문에 두 객체를 넣을 수 있다.
class MyServiceTest {
@Test
@DisplayName("2개 이상의 조회 빈을 모두 사용")
void testMultiBeans() {
ApplicationContext ac = new AnnotationConfigApplicationContext(AutoConfig.class, MyService.class);
MyService myService = ac.getBean(MyService.class);
myService.findMyRepository("memoryRepository");
myService.findMyRepository("jpaRepository");
}
static class MyService {
private final Map<String, MyRepository> repositoryMap;
public MyService(Map<String, MyRepository> repositoryMap) {
this.repositoryMap = repositoryMap;
}
public void findMyRepository(String myRepositoryCode) {
System.out.println("MyRepository = " + repositoryMap.get(myRepositoryCode));
}
}
}
테스트를 실행해보면 두 Repository 객체가 출력되는 것을 확인할 수 있다. 따라서 필요에 따라 Map에서 적절한 Repository를 뽑아내서 사용하면 된다.
[ Reference ]
반응형
'IT 개인 공부 > Spring' 카테고리의 다른 글
[Spring] 빈 스코프(Scope) 종류 (0) | 2021.08.23 |
---|---|
[Spring] 싱글톤 컨테이너 : CGLIB (0) | 2021.08.22 |
[Spring] 조회 빈(Bean)이 2개 이상일때 처리하는 방법 (0) | 2021.08.18 |
[Spring] Bean & DI & IoC 컨테이너 (0) | 2021.08.13 |
[Spring] 스프링(Spring) MVC 패턴 (0) | 2021.08.12 |
댓글