본문 바로가기
IT 개인 공부/Spring

[Spring] 조회한 빈(Bean)이 모두 필요할때 처리하는 방법

by Libi 2021. 8. 19.
반응형

이전 글에서 하나의 객체에 빈을 주입해야 하는데 조회한 빈(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 ]

· https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

 

반응형

댓글