Spring IoC 컨테이너와 Bean
정의
IoC(Inversion of Control) 는 객체가 자신의 의존성을 직접 생성하거나 찾는 대신, 외부(컨테이너)로부터 주입받는 원칙이다. DI(Dependency Injection) 는 IoC의 구체적인 구현 형태로, 객체가 의존성을 다음 방식으로만 정의한다:
- 생성자 인자(constructor arguments)
- 팩토리 메서드 인자
- 생성/반환 후 설정되는 프로퍼티
IoC 컨테이너가 Bean 생성 시 이 의존성들을 주입한다. 이는 Bean이 직접 클래스를 생성하거나 Service Locator 패턴을 사용하는 것과 근본적으로 반대(inverse) 되는 프로세스다.
동작 원리
BeanFactory vs ApplicationContext
| 구분 | BeanFactory | ApplicationContext |
|---|---|---|
| 역할 | 설정 프레임워크 + 기본 기능 | BeanFactory의 완전한 상위 집합 |
| AOP 통합 | 기본적 | 쉬운 통합 |
| 메시지 리소스 | 미지원 | 국제화(i18n) 지원 |
| 이벤트 발행 | 미지원 | 이벤트 퍼블리케이션 지원 |
| 애플리케이션 컨텍스트 | 없음 | WebApplicationContext 등 제공 |
실무에서는 ApplicationContext를 사용한다. BeanFactory는 설정 프레임워크와 기본 기능만 제공하고, ApplicationContext가 엔터프라이즈에 필요한 기능을 추가한다.
핵심 패키지
org.springframework.beans— BeanFactory 인터페이스, 모든 타입의 객체를 관리하는 설정 메커니즘org.springframework.context— ApplicationContext, BeanFactory의 하위 인터페이스
Bean이란
Spring IoC 컨테이너가 인스턴스화, 조립, 관리하는 객체를 Bean이라 한다. Bean은 애플리케이션의 백본(backbone)을 구성하며, Bean 간의 의존 관계는 컨테이너가 사용하는 설정 메타데이터(configuration metadata) 에 반영된다.
일반 객체와의 차이: Bean은 컨테이너에 의해 생명주기가 관리되는 객체이며, 그 외에는 애플리케이션의 여러 객체 중 하나일 뿐이다.
관련 개념
- Bean Overview - BeanDefinition 메타데이터, 네이밍, 인스턴스화 방식
- Dependency Injection - 생성자/Setter DI 비교, 인자 해결, 순환 의존성
- Spring IoC Container Overview - ApplicationContext 역할, 설정 메타데이터, 컨테이너 사용법
- Spring Core Technologies - Spring 핵심 기술 전체 개요
- Spring Framework Overview - Spring Framework 소개와 설계 철학