Spring IoC 컨테이너와 빈 이해하기

Spring IoC 컨테이너와 빈 이해하기

객체가 자기 의존 관계를 스스로 만들면 결합도가 높아져요. 예를 들어 어떤 클래스가 필요한 다른 객체를 직접 new로 만들면, 그 객체를 교체하거나 테스트할 때마다 손이 많이 가죠. Spring은 이 문제를 제어의 역전(IoC)으로 풀어요. 객체는 의존성을 "어떻게 만들지"를 몰라도 되고, 그 대신 컨테이너가 만들어 주는 걸 받아 쓰는 구조예요.

출처: Introduction to the Spring IoC Container and Beans

의존성 주입(DI)이란

의존성 주입(Dependency Injection, DI)은 IoC의 한 형태예요. 객체가 자기 의존성을 정의할 때 직접 인스턴스를 만들지 않고, 생성자 인자·팩토리 메서드 인자·세터 프로퍼티를 통해 받아요. 그리고 IoC 컨테이너가 빈을 만들 때 그 의존성을 주입해 주는 거예요. 이름처럼, 객체가 주도하는 게 아니라 제어가 컨테이너 쪽으로 뒤집힌(inverse) 흐름이라서 Inversion of Control이라고 불러요.

BeanFactory와 ApplicationContext

Spring IoC 컨테이너의 기반은 org.springframework.beansorg.springframework.context 패키지예요. BeanFactory 인터페이스는 어떤 타입의 객체든 관리할 수 있는 설정 메커니즘을 제공하고, ApplicationContext는 그 하위 인터페이스로 더 많은 기능을 더해요.

  • Spring의 AOP 기능과의 쉬운 통합
  • 메시지 리소스 처리(국제화 용도)
  • 이벤트 발행
  • 웹 애플리케이션용 WebApplicationContext 같은 애플리케이션 계층 전용 컨텍스트

정리하면 BeanFactory가 설정 프레임워크와 기본 기능을 담당하고, ApplicationContext가 그 위에 엔터프라이즈 기능을 얹은 완전한 상위 호환이에요. 이 장에서는 주로 ApplicationContext를 기준으로 설명해요.

빈(Bean)이란

Spring에서 애플리케이션의 뼈대를 이루면서 IoC 컨테이너가 관리하는 객체를 **빈(bean)**이라고 불러요. 빈은 컨테이너가 인스턴스화·조립·관리하는 객체예요. 그렇지 않은 객체는 그냥 애플리케이션의 많은 객체 중 하나일 뿐이에요. 빈과 빈 사이의 의존 관계는 컨테이너가 쓰는 설정 메타데이터에 반영돼요.

즉 "내가 직접 만들고 관리할지, 컨테이너가 만들고 관리할지"의 차이예요. 컨테이너가 관리하는 객체를 빈이라고 부른다고 기억하면 돼요.

더 알아보기