Spring

[Spring 완전 정복 시리즈] 12편 - 다양한 빈 조회와 스프링 컨테이너의 숨겨진 기능들

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

스프링 컨테이너의 생성, 빈 등록과 조회까지 알아봤다.

이번 편에서는 빈 조회의 다양한 케이스, 스프링 컨테이너가 제공하는 추가 기능들, 그리고 그 핵심을 관통하는 BeanDefinition 메타정보에 대해 정리해본다.


요구사항

 

  • 빈이 상속 관계일 때의 조회 방법을 알고 싶다.
  • 스프링 컨테이너가 제공하는 다양한 기능을 활용하고 싶다.
  • 설정 방식이 달라도 일관된 메커니즘으로 빈을 다루고 싶다.

문제점

 

  • 부모 타입으로 조회할 경우 자식이 여러 개면 어떤 게 반환되는지 헷갈릴 수 있다.
  • 단순한 빈 관리 외에도 다양한 부가기능을 어떻게 활용할지 모르겠다.
  • 자바, XML 등 설정 방식이 다른데 스프링이 어떻게 하나로 관리할 수 있는지 이해가 안 된다.

 


개선 방향: 다양한 조회 방식과 BeanDefinition 이해하기

 

1. 부모 타입으로 빈 조회하기

 

  • 부모 타입으로 조회하면 자식 클래스까지 모두 함께 조회된다.
  • 같은 타입의 빈이 여러 개라면, @Qualifier나 빈 이름으로 명확히 지정해야 한다.
Map<String, DiscountPolicy> beansOfType = ac.getBeansOfType(DiscountPolicy.class);

 


2. 스프링 컨테이너의 다양한 기능들

 

ApplicationContext는 단순한 빈 관리 외에도 다음과 같은 다양한 기능을 제공한다.

기능 설명
MessageSource 국제화 메시지 처리
Environment 환경 설정, 프로파일 처리
ApplicationEventPublisher 이벤트 발행 및 리스닝
ResourceLoader 파일, 클래스패스 리소스 접근

 

이 기능들은 실무 개발에서 메시지 처리, 설정 관리, 이벤트 기반 처리 등에 자주 사용된다.

 


3. BeanFactory vs ApplicationContext

항목 BeanFactory ApplicationContext
핵심 IoC 컨테이너 O O
부가 기능 제공 X O
실무 사용 빈도 거의 안 씀 대부분 사용

 

대부분의 경우 ApplicationContext만 사용해도 충분하다.

 


4. 다양한 설정 형식의 지원 원리

 

스프링은 자바 코드, XML 등 다양한 설정 형식을 모두 BeanDefinition이라는 구조로 통일해서 처리한다.

 

  • 설정 형식은 다르지만, 결국 BeanDefinition으로 변환된다.
  • 이 메타정보를 통해 빈 생성, 의존 관계 주입이 이루어진다.
BeanDefinition bd = ac.getBeanDefinition("memberService");

실무에서 직접 다룰 일은 드물지만, 오픈소스나 스프링 내부 코드를 볼 때 등장할 수 있다.

 


설계 원칙 정리

  • 부모 타입 조회 시 자식 빈까지 모두 함께 조회된다.
  • ApplicationContext는 단순 IoC를 넘어 다양한 기능을 함께 제공한다.
  • 스프링은 BeanDefinition이라는 메타정보를 통해 설정 형식을 추상화한다.
  • 실무에서는 ApplicationContext만으로 대부분의 기능을 커버할 수 있다.