Spring IoC 컨테이너와 Bean

정의

IoC(Inversion of Control) 는 객체가 자신의 의존성을 직접 생성하거나 찾는 대신, 외부(컨테이너)로부터 주입받는 원칙이다. DI(Dependency Injection) 는 IoC의 구체적인 구현 형태로, 객체가 의존성을 다음 방식으로만 정의한다:

  • 생성자 인자(constructor arguments)
  • 팩토리 메서드 인자
  • 생성/반환 후 설정되는 프로퍼티

IoC 컨테이너가 Bean 생성 시 이 의존성들을 주입한다. 이는 Bean이 직접 클래스를 생성하거나 Service Locator 패턴을 사용하는 것과 근본적으로 반대(inverse) 되는 프로세스다.

동작 원리

BeanFactory vs ApplicationContext

구분BeanFactoryApplicationContext
역할설정 프레임워크 + 기본 기능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은 컨테이너에 의해 생명주기가 관리되는 객체이며, 그 외에는 애플리케이션의 여러 객체 중 하나일 뿐이다.

관련 개념