클라우드 낚시꾼

[Spring] 스프링 빈에 대하여 (BeanDefinition + 스프링 빈 조회) 본문

BE Framework/SpringBasic

[Spring] 스프링 빈에 대하여 (BeanDefinition + 스프링 빈 조회)

KanuBang 2024. 3. 12. 17:33
728x90

이 글에서 BeanDefinition과 스프링 빈을 조회하는 방법을 중점으로 빈에 대하여 알아 볼 것이다. 그럼 시작해보자!


1. BeanDefinition

BeanDefinition은 Spring Framework에서 빈(Bean)의 메타 정보를 나타내는 인터페이스이다. 스프링 컨테이너에 스프링 빈을 등록할 때 BeanDefinition에 의해 빈 메타정보를 설정하게 되어 있다. BeanDefinition은 빈 이름, 역할, 스코프 등 다양한 정보를 제공한다. BeanDefiniton이 제공하는 정보는 아래를 참고하자.

 

BeanDefinition (Spring Framework 6.1.4 API)

Return the current bean class name of this bean definition. Note that this does not have to be the actual class name used at runtime, in case of a child definition overriding/inheriting the class name from its parent. Also, this may just be the class that

docs.spring.io


2. 스프링 컨테이너 / BeanDefinition 이 제공하는 스프링 빈 조회 관련 기능

- 스프링 컨테이너

  • getBeanDefinitionNames(): 스프링에 등록된 모든 빈 이름을 조회한다. (String 배열로 리턴한다.)
  • getBean(name, type): 빈 이름 또는 타입으로 빈 객체(인스턴스)를 조회한다.
  • getBeanDefinition(name): 빈 이름에 해당하는 BeanDefinition 정보를 반환한다.
  • getBeansOfType(type): 전달받은 타입에 해당하는 모든 빈을 조회한다. 반환 값은 빈 이름을 key, 빈 객체를 value로 하는 Map이다.

- BeanDefinition 

  • ROLE
    • BeanDefinition.ROLE_INFRASTRUCTURE: 스프링 내부에서 사용하는 빈
    • BeanDefinition.ROLE_APPLICATION: 프로그래머가 직접 등록한 빈
  • getRole(): 빈 설정 메타 정보 중 ROLE 정보를 반환

3. 다양한 getBean() 조회 방법과 발생한 가능한 예외

- 이름과 타입으로 다양하게 조회 가능하다.

// 이름으로 조회 (이름 + 타입)
MyBean myBean = applicationContext.getBean("myBeanName", MyBean.class);
// 타입으로 조회
MyBean myBean = applicationContext.getBean(MyBean.class);
// 구체 타입으로 조회
MySpecificBean mySpecificBean = applicationContext.getBean(MySpecificBean.class);

- 부모 타입과 하위(자식) 타입으로 다양하게 조회 가능하다.

@Configuration
static class TestConfig {
    @Bean
    public Parent son() {
        return new Son();
    }
    @Bean
    public Parent daughter() {
        return new Daughter();
    }
}

// 부모 타입으로 조회
Parent child1 = ac.getBean("son", Parent.class);

// 특정 하위(자식) 타입으로 조회
FixDiscountPolicy discountPolicy = ac.getBean(FixDiscountPolicy.class);

- getBean()시 발생한 가능한 예외

  • NoSuchBeanDefinitionException: 조회 실패 시 발생하는 예외이다.
  • NoUniqueBeanDefinitionException: 스프링 컨테이너에서 빈을 검색할 때 둘 이상의 빈이 발견되었고, 이를 해결할 수 없는 경우에 발생한다. 주로 타입만으로 조회할 때, 부모 타입으로 조회할 때 결과가 중복될 가능성이 높다.

4. NoUniqueBeanDefinitionException 발생 상황과 해결책

  • 타입으로 조회시 같은 타입이 둘 이상 있으면, 중복 오류가 발생한다. ->  빈 이름을 지정하여 조회하자
  • 부모 타입으로 조회시, 자식이 둘 이상 있으면, 중복 오류가 발생한다. ->  빈 이름을 지정하여 조회하자.

즉, 해결책은 "빈 이름을 지정하자." 이다.


5. 마치며.. (+출처)

Bean 관련 메서드 중 많이 쓰이는 것을 위주로 알아보았다. 이외에도 다양한 Bean 관련 메서드가 있는데 필요할 때마다 찾아서 써보도록 하자. 

 

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

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보세요! 📢

www.inflearn.com

 

728x90