개발/Spring

[Spring] 스프링 컨테이너의 종류와 주요 메소드

함수형 인간 2025. 1. 23. 18:45

스프링 컨테이너

 

스프링 컨테이너의 종류는 BeanFactory 와 ApplicationContext로 크게 두 가지이다. 

1. BeanFactory

1.1 설명.

  • 가장 기본적인 형태의 컨테이너
  • 객체의 생성과 의존성 주입에 대한 기본적인 기능을 제공
  • 객체를 실제로 사용하는 시점에 생성(lazy-loading) 합니다. 즉, 애플리케이션 시작 시 모든 빈을 생성하는 것이 아니라, 해당 빈이 요청될 때 생성
  • 주로 리소스가 제한적인 환경(예: 모바일, 임베디드) 에서 사용
  • 일반적으로 애플리케이션에서는 BeanFactory를 직접 사용하기 보다는 BeanFactory를 확장한 ApplicationContext를 사용

1.2 BeanFactory의 주요 메소드

  • getBean(String name):
    • 설명: 지정된 이름의 빈 인스턴스를 반환합
    • 파라미터: name - 빈의 이름
    • 반환: 빈 인스턴스 (Object 타입, 형변환 필요)
    • 예외: NoSuchBeanDefinitionException - 해당 이름의 빈이 없을 경우
  • getBean(String name, Class<T> requiredType):
    • 설명: 지정된 이름과 타입의 빈 인스턴스를 반환
    • 파라미터:
      • name - 빈의 이름
      • requiredType - 빈의 예상 타입
    • 반환: 빈 인스턴스 (지정된 타입)
    • 예외:
      • NoSuchBeanDefinitionException - 해당 이름의 빈이 없을 경우
      • BeanNotOfRequiredTypeException - 빈의 타입이 requiredType과 일치하지 않을 경우
  • getBean(Class<T> requiredType):
    • 설명: 지정된 타입의 빈 인스턴스를 반환. 해당 타입의 빈이 여러 개일 경우 예외가 발생
    • 파라미터: requiredType - 빈의 타입
    • 반환: 빈 인스턴스 (지정된 타입)
    • 예외:
      • NoSuchBeanDefinitionException - 해당 타입의 빈이 없을 경우
      • NoUniqueBeanDefinitionException - 해당 타입의 빈이 두 개 이상일 경우
  • containsBean(String name):
    • 설명: 해당 이름의 빈이 컨테이너에 존재하는지 여부를 확인
    • 파라미터: name - 빈의 이름
    • 반환: true (존재), false (존재하지 않음)
  • isSingleton(String name):
    • 설명: 해당 이름의 빈이 싱글톤 스코프인지 확인
    • 파라미터: name - 빈의 이름
    • 반환: true (싱글톤), false (싱글톤 아님)
    • 예외: NoSuchBeanDefinitionException - 해당 이름의 빈이 없을 경우

 

2. ApplicationContext

2.1 설명

  • BeanFactory를 확장한  컨테이너
  • BeanFactory의 모든 기능을 포함하며, 다양한 부가 기능들을 추가로 제공
  • 대표적인 부가 기능은 다음과 같습니다:
    • 트랜잭션 관리
    • AOP (Aspect-Oriented Programming) 통합
    • 메시지 리소스 처리 (국제화 지원)
    • 이벤트 발행(Application Event)
    • 다양한 자원(Resource) 로딩 (ex: 파일시스템, 클래스패스, URL)
    • 여러 개의 컨텍스트를 계층적으로 구성
    • 애플리케이션 시작 시 모든 싱글톤 빈을 미리 생성(pre-instantiate) (lazy-init 설정을 통해 변경 가능)

2.2 ApplicationContext의 주요 메소드 (BeanFactory 메소드 포함)

  • BeanFactory의 모든 메소드
  • getMessage(String code, Object[] args, String defaultMessage, Locale locale):
    • 설명: 국제화(i18n)를 위한 메시지 코드를 기반으로 메시지를 가져옴
    • 파라미터:
      • code - 메시지 코드
      • args - 메시지에 포함될 파라미터 (Optional)
      • defaultMessage - 코드를 찾지 못했을 때 반환할 기본 메시지
      • locale - 메시지 로케일 (국가/언어)
    • 반환: 로케일에 맞는 메시지 문자열
  • getEnvironment():
    • 설명: 애플리케이션 환경(Environment) 객체를 반환합니다. 프로파일, 프로퍼티 정보 등에 접근가능
    • 반환: Environment 객체
  • getResource(String location):
    • 설명: 지정된 위치의 리소스(파일, URL 등)를 Resource 객체로 가져옴
    • 파라미터: location - 리소스 위치 (ex: "classpath:myconfig.xml", "file:/path/to/file.txt", "https://...")
    • 반환: Resource 객체
  • publishEvent(Object event):
    • 설명: 애플리케이션 이벤트를 발생시킵니다. 등록된 ApplicationListener들이 이벤트를 받아 처리
    • 파라미터: event - 발생시킬 이벤트 객체 (일반적으로 ApplicationEvent를 상속)
  • getBeanDefinitionNames():
    • 설명: 컨테이너에 등록된 모든 빈 정의의 이름을 배열로 반환
    • 반환: 빈 정의 이름 배열 (String[])
  • getParentBeanFactory():
    • 설명: 현재 ApplicationContext의 부모 BeanFactory를 반환. 계층 구조로 구성된 경우 사용
    • 반환: 부모 BeanFactory (없으면 null)

 

 

2.3 ApplicationContext 의 구현체

ApplicationContext는 인터페이스이며, 실제로는 그 구현체를 사용한다.  

 

  • AnnotationConfigApplicationContext: 자바 기반의 설정 (@Configuration, @Bean)을 사용하는 경우
  • ClassPathXmlApplicationContext: XML 설정 파일이 클래스패스에 위치하는 경우
  • FileSystemXmlApplicationContext: XML 설정 파일이 파일 시스템의 특정 경로에 위치하는 경우
  • WebApplicationContext (interface): 웹 애플리케이션 용 ApplicationContext. 일반적으로 DispatcherServlet에 의해 로드되고 관리됨
    • XmlWebApplicationContext: XML 설정 기반
    • AnnotationConfigWebApplicationContext: 자바 설정 기반



2.4 ApplicationContext 와 BeanDefinition 

Bean Definition과 스프링 컨테이너

 

스프링은 컨테이너는  어떻게 xml, 어노테이션, javaConfig 등 다양한 설정 방식을 통해서 스프링 빈을 만들 수 있을까?

방법은 다양한 설정 파일을 읽어 들여 빈 설정 메타정보인 BeanDefinition 객체를 만드는것이다.

즉 스프링은   BeanDefinition 이라는 추상화를 통해 다양한 설정 정보를 스프링 빈으로 만든다.

 

BeanDefinition 구성

  • BeanClassName: 생성할 빈의 클래스 명(자바 설정 처럼 팩토리 역할의 빈을 사용하면 없음)
  • factoryBeanName: 팩토리 역할의 빈을 사용할 경우 이름
  • factoryMethodName: 빈을 생성할 팩토리 메서드 지정
  • Scope: 싱글톤(기본값)
  • lazyInit: 스프링 컨테이너를 생성할 때 빈을 생성하는 것이 아니라, 실제 빈을 사용할 때 까지 최대한 생성을 지연처리 하는지 여부
  • InitMethodName: 빈을 생성하고, 의존관계를 적용한 뒤에 호출되는 초기화 메서드 명
  • DestroyMethodName: 빈의 생명주기가 끝나서 제거하기 직전에 호출되는 메서드 명
  • Constructor arguments, Properties: 의존관계 주입에서 사용.