Kim-Baek 개발자 이야기

[스프링 핵심원리] 23. 컨테이너에 등록된 모든 빈 조회 본문

개발/Spring

[스프링 핵심원리] 23. 컨테이너에 등록된 모든 빈 조회

김백개발자 2021. 10. 25. 20:43
김영한님의 [스프링 핵심 원리] 강의를 정리하고, 내가 생각한 내용까지 정리하는 포스팅

지난번에 스프링을 사용해서 빈을 어떻게 등록하는지 알게되었습니다. 실제로 등록이 되었다고는 하는데, 정말 등록이 된게 맞는지 직접 확인을 해볼 필요가 있습니다. 그래서 컨테이너에 등록된 빈을 한번 조회해보도록 하겠습니다.

package core.order.beanfind;

import core.order.AppConfig;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class ApplicationContextInfoTest {

    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("name = " + beanDefinitionName + ", object = " + bean);
        }
    }

    @Test
    @DisplayName("애플리케이션 빈 출력하기")
    void findApplicationBean() {
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
            //Role ROLE_APPLICATION: 직접 등록한 애플리케이션 빈
            //Role ROLE_INFRASTRUCTURE: 스프링이 내부에서 사용하는 빈
            if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
                Object bean = ac.getBean(beanDefinitionName);
                System.out.println("name = " + beanDefinitionName + ", object = " + bean);
            }
        }
    }
}

먼저 findAllBean 메소드로 테스트를 돌려보도록 하겠습니다. 컨테이너에서 모든 빈의 이름을 가져와서 출력하는 기능을 지닌 테스트 메소드입니다.

위와 같은 결과가 나오는 것을 확인할 수 있습니다. 아래에는 저희가 등록한 빈들이 제대로 보이는 것을 볼 수 있습니다. 하지만 위에 있는 org.springframework 로 시작하는 빈은 저희가 등록하지 않았는데 같이 나오고 있습니다 이거는 스프링이 자체적으로 등록한 빈이라서 전체 빈을 노출할 때 같이 노출이 되는 경우입니다 .

저희가 원하는 것은 직접 등록한 빈에 대해서만 나오는 것을 원하기 때문에 findApplicationBean 테스트 메소드를 통해서 찾아보겠습니다.

정상적으로 우리가 등록된 빈들만 노출되는 것을 확인할 수 있습니다. BeanDefinition 에서 롤을 찾아서 확인하면 됩니다. ROLE_APPLICATION이 개발자가 직접 등록한 빈입니다. 

이렇게 @Configuration 을 통해서 등록한 빈들이 제대로 있는 것까지 확인을 해봤습니다.


 

반응형
Comments