Introduction to the Spring IoC Container and Beans

2023. 12. 10. 20:37Spring Framework/Spring IoC

🌱 Spring IoC Container와 Bean 소개

Spring Framework는 자바 애플리케이션 개발에서 가장 널리 사용되는 프레임워크 중 하나입니다. 그 핵심에는 제어의 역전(Inversion of Control, IoC) 원칙을 구현한 IoC 컨테이너가 있습니다. 이 글에서는 Spring의 IoC 컨테이너와 Bean 개념에 대해 구체적으로 살펴보겠습니다.

 

🔁 Inversion of Control(IoC)란?

IoC는 객체 간의 의존성 관리에 대한 제어 권한을 애플리케이션 코드가 아닌 컨테이너에게 위임하는 설계 원칙입니다.

  • 💡 전통적인 방식: 객체가 직접 다른 객체를 생성하거나 검색
  • 💡 IoC 방식: 컨테이너가 객체를 대신 생성하고 필요한 의존 객체를 주입

 

💉 IoC의 구체적인 구현: Dependency Injection(DI)

Spring에서는 IoC의 구현 방법으로 DI(의존성 주입)를 사용합니다. DI는 객체가 스스로 의존 객체를 생성하거나 찾지 않고, 필요한 의존성을 외부에서 주입받는 방식입니다.

 

✅ DI 방식

DI는 아래와 같은 방식으로 의존성을 정의합니다:

  • Constructor arguments
  • 팩토리 메서드의 아규먼트(이 팩토리 메서드는 GoF의 Factory Method 디자인 패턴이 아님)
  • 객체 생성 이후 설정되는 프로퍼티 (setter injection)

Spring IoC 컨테이너는 이러한 정의를 기반으로 bean을 생성하면서 의존 객체를 자동으로 주입합니다. 이 구조는 객체가 직접 의존 객체를 생성하거나 찾는 방식(Service Locator 패턴 등)과는 반대이며, 이 점에서 제어의 역전(Inversion of Control)이라 불립니다.

 

🏗️ Spring IoC 컨테이너의 핵심 패키지

Spring IoC 컨테이너의 핵심 구현은 다음 두 패키지에 있습니다:

  • org.springframework.beans
  • org.springframework.context

 

⚙️ BeanFactory vs ApplicationContext

🧰 BeanFactory

  • Spring IoC 컨테이너의 가장 기본적인 인터페이스
  • 모든 타입의 객체를 구성 및 관리 가능
  • 매우 가볍고 유연한 설정 프레임워크

하지만 엔터프라이즈 애플리케이션에 필요한 다양한 기능은 부족합니다.

 

🏢 ApplicationContext (BeanFactory의 하위 인터페이스)

ApplicationContextBeanFactory보다 풍부한 기능을 제공합니다:

기능 설명
🎯 AOP 통합 Spring AOP와의 손쉬운 통합 지원
🌐 국제화 지원 메시지 리소스 처리 (i18n)
📢 이벤트 발행 컨테이너 이벤트 처리 기능
🌍 웹 애플리케이션 특화 컨텍스트 WebApplicationContext 등 지원

 

🔍 정리하면:

  • BeanFactory: 최소한의 구성 기능 제공
  • ApplicationContext: BeanFactory의 상위 superset으로, 엔터프라이즈 애플리케이션에 필수적인 기능들을 포함
📌 본 장에서는 설명의 일관성을 위해 전반적으로 ApplicationContext를 기준으로 설명합니다. BeanFactory
의 사용은 별도 섹션에서 다룹니다.

 

🫘 Bean이란?

Spring에서 bean은 IoC 컨테이너가 관리하는 핵심 객체입니다.

 

🎯 Bean의 정의

  • Spring IoC 컨테이너에 의해 생성, 조립, 관리되는 객체
  • 실제로는 단순한 자바 객체(POJO)이지만, 컨테이너의 관리 대상이 되면 Bean이라 부름
📌 다시 말해, 애플리케이션 내부에는 수많은 객체가 존재하지만, 그 중 Spring 컨테이너에 의해 관리되는 객체만이 "bean"입니다.

 

🧩 Bean 구성 정보: Configuration Metadata

Spring IoC 컨테이너는 Bean과 그 사이의 의존성을 이해하기 위해 구성 메타데이터(configuration metadata)를 사용합니다. 이 메타데이터는 보통 다음 형태로 제공됩니다:

  • XML 설정
  • Java Config (@Configuration, @Bean)
  • Annotation 기반 자동 감지 (@Component, @Service, @Repository 등)
🧠 구성 메타데이터는 IoC 컨테이너에게 "무엇을, 어떻게" 생성하고 연결해야 할지를 알려주는 설계도입니다.

 

🧭 정리

요소 설명
🎯 IoC 객체 생성 및 의존성 주입 제어를 컨테이너가 수행
💉 DI IoC의 구현 방식: 생성자, 메서드, 프로퍼티 기반 주입
🏗️ BeanFactory IoC의 기본 컨테이너 인터페이스
🏢 ApplicationContext BeanFactory + 추가 기능 (AOP, 이벤트, i18n 등)
🫘 Bean Spring IoC 컨테이너가 관리하는 애플리케이션 객체
🧾 구성 메타데이터 Bean과 의존성 정보를 기술하는 설계도

 

✅ 요약

Spring의 IoC 컨테이너는 객체 생명주기와 의존성 관리를 프레임워크 차원에서 처리함으로써, 애플리케이션의 유연성과 테스트 용이성을 크게 향상시켜줍니다. 이 개념은 Spring을 제대로 이해하기 위한 첫 관문이기도 하니, 확실히 익혀두시길 바랍니다! 💪

 

출처 : https://docs.spring.io/spring-framework/reference/core/beans/introduction.html

 

Introduction to the Spring IoC Container and Beans :: Spring Framework

This chapter covers the Spring Framework implementation of the Inversion of Control (IoC) principle. Dependency injection (DI) is a specialized form of IoC, whereby objects define their dependencies (that is, the other objects they work with) only through

docs.spring.io