본문 바로가기
개발자 공부 - 인프런 온라인 강의/스프링 핵심 원리 - 기본편

[섹션 4. 스프링 컨테이너와 스프링 빈] 스프링 빈 조회 - 동일한 타입이 둘 이상 / 인프런 김영한 스프링 핵심 원리 기본편

by easpop 2023. 3. 19.
728x90
반응형

이번 시간에는 스프링 조회를 할 때, 동일한 타입이 둘 이상이면 오류가 발생하는데,

그런 경우에 스프링 빈 조회하는 방법을 알아보았다.

 

앞서 설명한 것과 같이, 스프링을 타입으로 조회할 때 동일한 타입이 둘 이상이면 오류가 발생한다.

이때는 빈 이름을 지정하면 된다.

혹은 ac.getBeansOfType()을 사용하면 해당 타입의 모든 빈을 조회할 수 있다.

 

테스트를 하기 위해 클래스를 생성해준다.

 

타입을 중복으로 설정하기 위해서는 AppConfig 클래스를 수정해줘야 하지만,

그렇게 하지 않고 위 그림의 15번째 줄의 new AnnotationConfigApplicationContext의 괄호안에 있는

AppConfig.class를 지우고, SameBeanConfig.class로 바꿔준다.

그리고 추가로 static 메소드를 생성해준다.

참고로, 클래스 안에서 static을 쓰면, 해당 메소드는 해당 클래스 내에서만 쓰겠다는 것을 의미한다.

 

23번째 줄에서 부터 인스턴스 타입이 같은 메소드를 이름만 다르게 해서 2개를 생성해준다.

왜냐하면, 예를 들어, 인스턴스 타입이 같더라도 파라미터값을 다르게 받을수도 있기 때문에,

위의 예시와 같이 만들수도 있다.

 

위의 그림과 같이 코딩을 한다면, getBean을 통해서 타입으로 호출하기 때문에,

MemberRepository 타입의 메소드가 2개가 있으므로 예외가 발생할 것이다.

반응형

흐름을 살펴보자면 아래와 같을것이다.

위와 같이 코딩하면 스프링 컨테이너가 생성될 때, SameBeanConfig.class 설정 정보를 가지고 생성을 하고,

스프링 컨테이너는 그 클래스에 있는 두개의 빈 객체들만 생성을 할 것이다.

그래서 getBean으로 타입을 조회하면, 두개의 빈 객체가 조회가 될 것이고,

그렇기 때문에 어떤 하나를 지정할 수 없기 때문에 예외가 발생하게 된다.

 

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.core.member.MemberRepository' available: expected single matching bean but found 2: memberRepository1,memberRepository2

 

테스트를 돌리면, 위와 같은 오류가 발생한다~~

오류명 말 그대로, NoUniqueBean, 즉 하나만 있는게 아니다~~

 

위의 그림에서 24번째 줄에 예외가 터지는것이 테스트를 통과하는 테스트 코드를 작성한다.

 

그리고 31번째 줄에, 테스트 코드로 빈의 이름을 지정해주는 테스트 코드를 작성한다.

타입으로 조회를 했다면 두개의 메소드가 나오기 때문에 오류가 나겠지만,

빈 이름을 지정해주기 때문에 정상 작동할 것이다.

 

전체 테스트 코드를 동작시켰을 때, 정상적으로 작동하는 것을 확인할 수 있다.

 

그리고 어떤 타입의 모든 빈 객체를 조회하는 테스트 코드를 작성한다.

 

타입으로 빈 조회시, 빈 전체 조회하는 기능인 ac.getBeansOfType을 사용해준다.

getBeansOfType으로 조회하게 되면, Map에 담아서 보여주기 때문에 

iterator를 통해서 Map에 있는 모든 값의 key와 value를 콘솔에 찍어준다.

 

테스트 결과, getBeansOfType으로 조회해서 Map에 담긴 모든 빈 객체들의 key값과 value 값이 정상적으로 출력되었다!

 

728x90
반응형

댓글