개발/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
스프링은 컨테이너는 어떻게 xml, 어노테이션, javaConfig 등 다양한 설정 방식을 통해서 스프링 빈을 만들 수 있을까?
방법은 다양한 설정 파일을 읽어 들여 빈 설정 메타정보인 BeanDefinition 객체를 만드는것이다.
즉 스프링은 BeanDefinition 이라는 추상화를 통해 다양한 설정 정보를 스프링 빈으로 만든다.
BeanDefinition 구성
- BeanClassName: 생성할 빈의 클래스 명(자바 설정 처럼 팩토리 역할의 빈을 사용하면 없음)
- factoryBeanName: 팩토리 역할의 빈을 사용할 경우 이름
- factoryMethodName: 빈을 생성할 팩토리 메서드 지정
- Scope: 싱글톤(기본값)
- lazyInit: 스프링 컨테이너를 생성할 때 빈을 생성하는 것이 아니라, 실제 빈을 사용할 때 까지 최대한 생성을 지연처리 하는지 여부
- InitMethodName: 빈을 생성하고, 의존관계를 적용한 뒤에 호출되는 초기화 메서드 명
- DestroyMethodName: 빈의 생명주기가 끝나서 제거하기 직전에 호출되는 메서드 명
- Constructor arguments, Properties: 의존관계 주입에서 사용.