Spring IoC 컨테이너와 빈 이해하기
Spring IoC 컨테이너와 빈 이해하기
객체가 자기 의존 관계를 스스로 만들면 결합도가 높아져요. 예를 들어 어떤 클래스가 필요한 다른 객체를 직접 new로 만들면, 그 객체를 교체하거나 테스트할 때마다 손이 많이 가죠. Spring은 이 문제를 제어의 역전(IoC)으로 풀어요. 객체는 의존성을 "어떻게 만들지"를 몰라도 되고, 그 대신 컨테이너가 만들어 주는 걸 받아 쓰는 구조예요.
의존성 주입(DI)이란
의존성 주입(Dependency Injection, DI)은 IoC의 한 형태예요. 객체가 자기 의존성을 정의할 때 직접 인스턴스를 만들지 않고, 생성자 인자·팩토리 메서드 인자·세터 프로퍼티를 통해 받아요. 그리고 IoC 컨테이너가 빈을 만들 때 그 의존성을 주입해 주는 거예요. 이름처럼, 객체가 주도하는 게 아니라 제어가 컨테이너 쪽으로 뒤집힌(inverse) 흐름이라서 Inversion of Control이라고 불러요.
BeanFactory와 ApplicationContext
Spring IoC 컨테이너의 기반은 org.springframework.beans와 org.springframework.context 패키지예요. BeanFactory 인터페이스는 어떤 타입의 객체든 관리할 수 있는 설정 메커니즘을 제공하고, ApplicationContext는 그 하위 인터페이스로 더 많은 기능을 더해요.
- Spring의 AOP 기능과의 쉬운 통합
- 메시지 리소스 처리(국제화 용도)
- 이벤트 발행
- 웹 애플리케이션용
WebApplicationContext같은 애플리케이션 계층 전용 컨텍스트
정리하면 BeanFactory가 설정 프레임워크와 기본 기능을 담당하고, ApplicationContext가 그 위에 엔터프라이즈 기능을 얹은 완전한 상위 호환이에요. 이 장에서는 주로 ApplicationContext를 기준으로 설명해요.
빈(Bean)이란
Spring에서 애플리케이션의 뼈대를 이루면서 IoC 컨테이너가 관리하는 객체를 **빈(bean)**이라고 불러요. 빈은 컨테이너가 인스턴스화·조립·관리하는 객체예요. 그렇지 않은 객체는 그냥 애플리케이션의 많은 객체 중 하나일 뿐이에요. 빈과 빈 사이의 의존 관계는 컨테이너가 쓰는 설정 메타데이터에 반영돼요.
즉 "내가 직접 만들고 관리할지, 컨테이너가 만들고 관리할지"의 차이예요. 컨테이너가 관리하는 객체를 빈이라고 부른다고 기억하면 돼요.