본문 바로가기
Spring/김영한 스프링 핵심원리 - 기본편

[섹션4-2] 컨테이너에 등록된 모든 빈 조회하기

by 보름달빵 2024. 2. 6.

 

앞에서 AppConfig의 설정에 따라 스프링 컨테이너에 빈들을 등록했는데 

과연 잘 등록되었을까?

 

우리가 설정한 빈들이 스프링 컨테이너에 잘 등록되었는지 확인해보기 위해

스프링 컨테이너에 있는 모든 빈들을 조회해보자. 

 

public class ApplicationContextTest {
    AnnotationConfigApplicationContext ac= 
              new AnnotationConfigApplicationContext(AppConfig.class);

    @Test
    @DisplayName("모든 빈 출력하기")
    void findAllBean(){

        // 스프링 컨테이너에 있는 모든 빈 출력하기
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            Object bean = ac.getBean(beanDefinitionName);
            System.out.println("빈 이름 = "+beanDefinitionName+","
            + "등록된 빈 class = " + bean);

        }
    }

}

 

  • getBeanDefinitionNames : 스프링에 등록된 모든 빈 이름을 조회한다

              빈 이름은 우리가 AppConfig 클래스에서 설정한 메서드의 이름이 된다.

  • getBean : 빈 이름으로 빈 객체를 조회한다.

              위의 코드에서는 클래스 타입을 지정할 수 없기 때문에 Object 형으로 설정함. 

 

 

위 코드의 실행 결과 , 빈들의 이름은 메서드의 이름과 동일하며, 우리가 @Bean으로 지정한 것들이 잘 등록되었음을 알 수 있다.

 

그런데  출력결과를 보면 @Bean으로 등록한 것들 뿐만 아니라 스프링에서 내부적으로 설정한 빈들도 모두 출력된다.

 

appconfig 위의 출력문은 스프링에서 등록한 빈이다.

 

우리가 설정한 빈들만 출력되도록 코드를 수정해보자 .

 

@Test
@DisplayName("우리가 설정한 빈들만 출력하기")
void findApplicationBean(){

   
    String[] beanDefinitionNames = ac.getBeanDefinitionNames();
    for (String beanDefinitionName : beanDefinitionNames) {

           BeanDefinition beanDefinition = 
                   ac.getBeanDefinition(beanDefinitionName);

        if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION)
        {
            Object bean = ac.getBean(beanDefinitionName);
            System.out.println("빈 이름 = "+beanDefinitionName+","
            +"등록된 빈 class = " + bean);

        }
        

    }
}

 

  •  getBeanDefinition : 빈 하나하나에 대한 정보
  • 스프링이 내부에서 사용하는 빈 :  getRole( ) 로 구분          
             - ROLE_APPLICATION:  직접 등록한 애플리케이션 빈
            -   ROLE_INFRASTRUCTURE: 스프링이 내부에서 사용하는 빈

 

 

코드를 수정한 뒤 출력화면에는 우리가 설정한 빈들만 나오는 것을 알 수 있다.