Spring

[Spring 완전 정복 시리즈] 11편 - 스프링 빈 조회와 ApplicationContext의 역할

dev-nadan 2025. 7. 27. 14:46

스프링 컨테이너에 빈이 잘 등록되었는지 확인하고 싶다면? 바로 빈 조회 테스트를 통해 확인할 수 있다.

 


요구사항

  • 등록된 빈 목록을 확인하고 싶다.
  • 특정 빈을 이름 혹은 타입으로 가져오고 싶다.
  • 스프링 내부에서 사용 중인 빈과 구분해서 보고 싶다.

빈 조회 예제

AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

@Test
@DisplayName("모든 빈 출력하기")
void findAllBean() {
    String[] beanNames = ac.getBeanDefinitionNames();
    for (String name : beanNames) {
        Object bean = ac.getBean(name);
        System.out.println("name = " + name + " / object = " + bean);
    }
}

@Test
@DisplayName("애플리케이션 빈 출력하기")
void findApplicationBean() {
    for (String name : ac.getBeanDefinitionNames()) {
        BeanDefinition bd = ac.getBeanDefinition(name);
        if (bd.getRole() == BeanDefinition.ROLE_APPLICATION) {
            System.out.println("name = " + name + " / object = " + ac.getBean(name));
        }
    }
}

 


참고: 기본 빈 조회 방법

Object bean = applicationContext.getBean("빈이름");
Object bean = applicationContext.getBean(타입.class);
Object bean = applicationContext.getBean("빈이름", 타입.class);

 

  • 구체 타입으로 조회할 수 있지만, 유연성이 떨어질 수 있으므로 인터페이스를 기준으로 조회하는 것이 바람직하다.
  • 같은 타입의 빈이 여러 개일 경우 NoUniqueBeanDefinitionException 예외가 발생할 수 있다.

 


ApplicationContext vs BeanFactory

 

특징
BeanFactory ApplicationContext
기본 IoC 기능 O O
부가 기능 (국제화, 이벤트, 메시지 처리 등) X O
실제 현업에서 사용 여부 거의 안 씀 대부분 사용

 


설계 원칙 정리

  • 빈은 이름, 타입, 혹은 둘 다를 이용해 조회 가능하다.
  • ApplicationContext는 단순한 빈 관리 외에도 많은 부가 기능을 제공하므로 대부분 이걸 사용한다.
  • 빈의 용도(Role)에 따라 애플리케이션 빈스프링 내부 빈으로 구분해볼 수 있다.