프로필사진

Go, Vantage point

가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.


Github | https://github.com/overnew/

Blog | https://everenew.tistory.com/





티스토리 뷰

반응형

 

 

 

* 김영한님의 스프링 핵심원리 기본편 강좌를 수강하며 정리한 글입니다. *

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

 

 

 

이전 글에서는 스프링 컨테이너와 스프링 빈에 대해서 간단히 소개하였다.

 

이번에는 스프링 빈의 조회 방식에 대해 알아보자.

 

스프링 빈 조회

 

기본적으로 사용하는 것은 ApplicationContext의 getBean() 함수 이다.

 getBean(빈 이름, 타입) 또는 getBean(타입) 으로 조회가 가능하다.

 

또한 getBeanDifinitionNames()로 모든 bean의 이름을 가져올 수도 있다.

만약 존재하지 않는 이름으로 조회 시 NoSuchBeanDefinitionException 예외가 발생한다.

 

 

단 타입만을 사용(getBean(타입))하여 조회 시, 같은 타입이 둘 이상이라면 오류가 발생한다.

 

 

 

Test 실행시 NoUniqueBean 오류가 발생

따라서 타입들 중에 특정 빈을 조회하려면 getBean(빈 이름, 타입) 으로 조회해야 한다.

 

또한 특정 타임의 모든 빈을 조회하기 위해 getBeanOfType(타입)을 사용할 수 있다.

 

 

스프링 빈의 상속 관계

 

getBean(타입)으로 특정 타입을 조회했을 때 해당 타입을 상속한 자식 타입들이 있을 수 있다.

스프링 빈에서는 원칙적으로 부모 타입 조회 시 자식 타입도 모두 같이 조회가 된다.

 

자바 클래스는 모두 최상위 클래스인 Object를 상속하고 있다. 따라서 Object 타입을 조회 시, 모든 스프링 빈을 조회할 수 있다.

 

만약 getBean(부모 타입) 으로 조회 시, 여러 자식 타입이 있다면 결국 NoUniqueBeanDefinitionException 오류가 발생한다.  그러므로 빈 이름을 지정해서 조회해주자.

 

혹은 구체적인 자식 클래스 타입 getBean(자식 타입) 으로 조회할 수는 있으나 좋은 방법은 아니다.

부모 클래스를 스프링 빈의 return 타입으로 명시해두는 이유는 추상화 프로그래밍을 하기 위함이다. 

구체적 클래스를 return 타입으로 설정하면 결국 구체적 클래스에 의존하게 될 것이다.

 

부모 클래스를 return하는 모든 빈 조회 시 아래와 같이 Map<빈 이름, 부모 타입>으로 가져올 수 있다.

Map<String, 부모 클래스> beansOfType = ac.getBeansOfType(부모클래스.class);

 

사실, 실제 개발에서는 getBean을 직접 사용하진 않는다고 한다.

 

 

반응형
댓글
반응형
인기글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함