Go, Vantage point
가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.
Github | https://github.com/overnew/
Blog | https://everenew.tistory.com/
티스토리 뷰
* 김영한님의 스프링 핵심원리 기본편 강좌를 수강하며 정리한 글입니다. *
이전 글에서는 스프링 컨테이너와 스프링 빈에 대해서 간단히 소개하였다.
이번에는 스프링 빈의 조회 방식에 대해 알아보자.
스프링 빈 조회
기본적으로 사용하는 것은 ApplicationContext의 getBean() 함수 이다.
getBean(빈 이름, 타입) 또는 getBean(타입) 으로 조회가 가능하다.
또한 getBeanDifinitionNames()로 모든 bean의 이름을 가져올 수도 있다.
만약 존재하지 않는 이름으로 조회 시 NoSuchBeanDefinitionException 예외가 발생한다.
단 타입만을 사용(getBean(타입))하여 조회 시, 같은 타입이 둘 이상이라면 오류가 발생한다.
따라서 타입들 중에 특정 빈을 조회하려면 getBean(빈 이름, 타입) 으로 조회해야 한다.
또한 특정 타임의 모든 빈을 조회하기 위해 getBeanOfType(타입)을 사용할 수 있다.
스프링 빈의 상속 관계
getBean(타입)으로 특정 타입을 조회했을 때 해당 타입을 상속한 자식 타입들이 있을 수 있다.
스프링 빈에서는 원칙적으로 부모 타입 조회 시 자식 타입도 모두 같이 조회가 된다.
자바 클래스는 모두 최상위 클래스인 Object를 상속하고 있다. 따라서 Object 타입을 조회 시, 모든 스프링 빈을 조회할 수 있다.
만약 getBean(부모 타입) 으로 조회 시, 여러 자식 타입이 있다면 결국 NoUniqueBeanDefinitionException 오류가 발생한다. 그러므로 빈 이름을 지정해서 조회해주자.
혹은 구체적인 자식 클래스 타입 getBean(자식 타입) 으로 조회할 수는 있으나 좋은 방법은 아니다.
부모 클래스를 스프링 빈의 return 타입으로 명시해두는 이유는 추상화 프로그래밍을 하기 위함이다.
구체적 클래스를 return 타입으로 설정하면 결국 구체적 클래스에 의존하게 될 것이다.
부모 클래스를 return하는 모든 빈 조회 시 아래와 같이 Map<빈 이름, 부모 타입>으로 가져올 수 있다.
Map<String, 부모 클래스> beansOfType = ac.getBeansOfType(부모클래스.class);
사실, 실제 개발에서는 getBean을 직접 사용하진 않는다고 한다.
'개발 > Spring' 카테고리의 다른 글
[Spring] 7. 싱글톤 컨테이너 (0) | 2022.06.26 |
---|---|
[Spring] 6. 스프링 컨테이너 설정 정보와 BeanDefinition (0) | 2022.06.25 |
[Spring] 4. 스프링 컨테이너와 스프링 빈 (0) | 2022.06.23 |
[Spring] 3. 제어의 역전(IoC)과 컨테이너 (0) | 2022.06.23 |
[Spring] 2. 구성 영역의 분리와 DI(Dependency Injection) (0) | 2022.05.30 |