Study/Spring

[Spring] 스프링 핵심 원리 - 스프링 컨테이너와 스프링 빈

sw_develop 2025. 4. 16. 21:49

스프링 컨테이너 생성

  • ApplicationContext 를 스프링 컨테이너라고 함 (인터페이스임)
  • 스프링 컨테이너는 XML을 기반으로 만들 수 있고, 어노테이션 기반의 자바 설정 클래스를 만들 수 있음
  • 참고)
    • 더 정확히는 스프링 컨테이너를 부를 때 BeanFactory, ApplicationContext 로 구분해서 이야기함
    • BeanFactory 를 직접 사용하는 경우는 거의 없으므로 일반적으로 ApplicationContext 를 스프링 컨테이너라고 함

 

스프링 컨테이너의 생성 과정

  1. 스프링 컨테이너 생성
    • 스프링 컨테이너를 생성할 때는 구성 정보를 지정해줘야 함
  2. 스프링 빈 등록
    • 빈 이름은 메서드명을 사용함
    • 빈 이름을 직접 부여할 수도 있음 (빈 이름은 항상 다른 이름을 부여해야 함)
  3. 스프링 빈 의존관계 설정 - 준비
  4. 스프링 빈 의존관계 설정 - 완료
    • 스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입(DI)함

 

스프링 빈 조회

  • 모든 빈 출력하기
    • applicationContext.getBeanDefinitionNames() : 스프링에 등록된 모든 빈 이름 조회
    • applicationContext.getBean() : 빈 이름으로 빈 객체(인스턴스) 조회
      • 조회 대상 스프링 빈이 없으면 예외 발생
    • applicationContext.getBeansOfType() : 해당 타입의 모든 빈 조회
    • 부모 타입으로 조회하면, 자식 타입도 함께 조회함
      • 모든 자바 객체의 최고 부모인 Object 타입으로 조회하면, 모든 스프링 빈 조회함
  • 어플리케이션 빈 출력하기
    • 스프링이 내부에서 사용하는 빈을 제외하고, 내가 등록한 빈만 출력
    • 스프링 내부에서 사용하는 빈은 getRole()로 구분할 수 있음
      • ROLE_APPLICATION : 일반적으로 사용자가 정의한 빈
      • ROLE_INFRASTRUCTURE : 스프링이 내부에서 사용하는 빈

 

BeanFactory와 ApplicationContext

  • BeanFactory
    • 스프링 컨테이너의 최상위 인터페이스
    • 스프링 빈을 관리하고 조회하는 역할 담당
      • getBean() 제공
      • 위에서 사용했던 대부분의 기능은 해당 인터페이스가 제공하는 기능임
  • ApplicationContext
    • BeanFactory 기능을 모두 상속받아 제공
    • 빈을 관리하고 조회하는 기능과 더불어, 수많은 부가기능을 제공함 (여러 인터페이스를 다중 상속 받음)
  • 정리하면,
    • ApplicationContext는 BeanFactory의 기능을 상속받아 빈 관리 기능 + 편리한 부가기능 제공
    • BeanFactory나 ApplicationContext를 스프링 컨테이너라 함
      • BeanFactory를 직접 사용할 일은 거의 없음
      • 부가기능이 포함된 ApplicationContext를 사용함

 

추가) ApplicationContext의 부가기능

더보기
  • 메시지소스를 활용한 국제화 기능
  • 환경변수
    • 로컬, 개발, 운영 등을 구분해서 처리
  • 어플리케이션 이벤트
    • 이벤트를 발행하고 구독하는 모델을 편리하게 지원
  • 편리한 리소스 조회
    • 파일, 클래스패스, 외부 등에서 리소스를 편리하게 조회

 

다양한 설정 형식 지원 - 자바 코드, XML

  • 스프링 컨테이너는 다양한 형식의 설정 정보를 받아들일 수 있게 유연하게 설계되어 있음
    • 자바 코드, XML, Groovy 등

 

스프링 빈 설정 메타 정보 - BeanDefinition

  • 스프링이 위와 같이 다양한 설정 형식을 지원할 수 있는 이유는 BeanDefinition 추상화가 있기 때문임 (여기서도 역할과 구현을 개념적으로 나눈 것)
  • BeanDefinition을 빈 설정 메타정보라고 함
    • @Bean, <bean>당 각각 하나씩 메타 정보가 생성됨

 

예시)

더보기
  • AnnotationConfigApplicationContext는 AnnotatedBeanDefinitionReader를 사용해 AppConfig.class를 읽고 BeanDefinition을 생성함

 

참고

스프링 핵심 원리 - 기본편