✅ 스프링 IoC 컨테이너란?
Spring IoC (Inversion of Control) 컨테이너는 Spring Framework의 핵심 기능 중 하나로, 객체의 생성, 관리, 의존성 주입을 담당하는 역할을 수행합니다. IoC 컨테이너는 애플리케이션의 컴포넌트들을 인스턴스화하고, 구성하며, 조립하는 일을 담당하여 개발자가 객체의 생성과 관리에 대한 부분을 직접 처리할 필요 없이 편리하게 사용할 수 있게 해줍니다.
➡️ IoC 컨테이너의 주요 기능은 다음과 같습니다
- 객체의 인스턴스화 및 생명주기 관리
IoC 컨테이너는 애플리케이션에서 사용할 객체들을 인스턴스화하고, 객체의 생명주기를 관리합니다. 객체의 생성, 초기화, 소멸 등을 컨테이너가 담당하여 개발자는 이에 대한 로직을 신경쓰지 않고 개발할 수 있습니다.
- 의존성 주입 (Dependency Injection)
IoC 컨테이너는 객체들 사이의 의존성을 관리하며, 필요한 의존 객체를 주입해줍니다. 개발자는 객체가 필요로 하는 의존성을 직접 생성하거나 찾아주는 코드를 작성하지 않아도 됩니다. 이를 통해 코드의 결합도를 낮추고 유연성과 테스트 용이성을 높일 수 있습니다.
- 객체의 구성 및 설정
IoC 컨테이너는 객체들의 구성과 설정을 담당합니다. 객체들의 관계, 속성, 설정 정보 등을 컨테이너가 관리하고, 이를 기반으로 객체들을 생성하고 구성합니다. XML, 애노테이션, 자바 설정 클래스 등 다양한 방식으로 객체들의 구성을 정의할 수 있습니다.
- 싱글톤 관리
IoC 컨테이너는 싱글톤 객체를 관리합니다. 기본적으로 Spring에서는 싱글톤으로 객체를 관리하며, 컨테이너는 동일한 타입의 객체에 대해 단일 인스턴스를 제공합니다. 이를 싱글톤 레지스트리 방식을 사용합니다.
Spring Framework에서는 다양한 IoC 컨테이너 구현체를 제공합니다. 가장 일반적인 컨테이너는 ApplicationContext 인터페이스를 구현한 구현체들입니다. XmlApplicationContext, AnnotationConfigApplicationContext, GenericApplicationContext 등이 일반적으로 사용되며, 각각의 컨테이너는 다양한 설정 방식과 기능을 제공합니다.
Spring IoC 컨테이너를 사용하면 객체의 생성과 관리를 프레임워크가 담당함으로써 개발자는 비즈니스 로직에 집중할 수 있습니다. 또한 의존성 주입을 통해 유연하고 확장 가능한 애플리케이션을 개발할 수 있습니다.
- 스프링 IoC 컨테이너의 전체 상속도(6.0.10 API)
- BeanFactory interface
BeanFactory는 스프링의 가장 기본적인 인터페이스로, IoC 컨테이너의 핵심 역할을 담당합니다.
- 주요 메소드
getBean(String name)
: 지정한 이름의 빈 객체를 반환합니다.
containsBean(String name)
: 지정한 이름의 빈 객체가 컨테이너에 존재하는지 확인합니다.
isSingleton(String name)
: 지정한 이름의 빈 객체가 싱글톤인지 확인합니다.
- 주요 메소드
- ApplicationContext interface
ApplicationContext는 BeanFactory 인터페이스를 확장한 인터페이스로, BeanFactory의 모든 기능을 포함하며 여러 가지 부가 기능을 추가로 제공합니다.
- 주요 메소드
getBean(String name)
: 지정한 이름의 빈 객체를 반환합니다.
getBean(Class<T> requiredType)
: 지정한 클래스 타입의 빈 객체를 반환합니다.
registerShutdownHook()
: 컨테이너가 종료될 때 자동으로 종료 처리를 위한 훅을 등록합니다.
- 주요 메소드
- AnnotationConfigApplicationContext class
AnnotationConfigApplicationContext는 애노테이션 기반의 자바 설정 파일을 사용하여 빈 객체를 로드하는 컨테이너입니다.
- 주요 메소드
register(Class<?>... annotatedClasses)
: 지정한 애노테이션 기반 설정 클래스를 등록합니다.
refresh()
: 컨테이너를 초기화하고 빈 객체를 로드합니다.
- 주요 메소드
- AnnotationConfigWebApplicationContext class
AnnotationConfigWebApplicationContext는 웹 애플리케이션에서 애노테이션 기반의 자바 설정 파일을 사용하여 빈 객체를 로드하는 컨테이너입니다.
- 주요 메소드
register(Class<?>... annotatedClasses)
: 지정한 애노테이션 기반 설정 클래스를 등록합니다.
refresh()
: 컨테이너를 초기화하고 빈 객체를 로드합니다.
- 주요 메소드
- GenericApplicationContext class
GenericApplicationContext는 일반적인 목적의 애플리케이션 컨텍스트입니다. XML이나 애노테이션 기반의 설정 모두를 지원합니다.
- 주요 메소드
registerBean(Class<?> beanClass, BeanDefinitionCustomizer... customizers)
: 지정한 클래스를 기반으로 빈 객체를 등록합니다.
refresh()
: 컨테이너를 초기화하고 빈 객체를 로드합니다.
close()
: 컨테이너를 닫고 자원을 정리합니다.
- 주요 메소드
✅ 싱글톤 레지스트리
싱글톤 레지스트리(Singleton Registry)는 Spring IoC 컨테이너에서 관리되는 빈(Bean) 객체의 인스턴스를 싱글톤으로 관리하는 메커니즘입니다. 싱글톤 레지스트리 방식은 싱글톤 패턴의 제약을 극복하기 위해 사용됩니다. 싱글톤 패턴은 객체의 인스턴스를 오직 한 개만 생성하여 공유하는 패턴이지만, 일반적인 싱글톤 패턴은 클래스 내부에 private
생성자와 public static
메서드를 사용하여 제약을 가지고 있습니다.
➡️ Spring의 싱글톤 레지스트리는 다음과 같은 특징을 가지고 있습니다
- 기본 동작(Default Behavior)
- Spring IoC 컨테이너는 기본적으로 빈 객체를 싱글톤으로 생성하여 관리합니다.
- 즉, 동일한 빈 정의에 대해 여러 번 요청해도 동일한 인스턴스를 반환합니다.
- 이를 통해 자원의 효율성을 높이고 객체 간의 일관성을 유지할 수 있습니다.
- 스레드 안전성(Thread Safety)
- 싱글톤 객체는 다중 스레드 환경에서 안전(Thread-safe)하게 관리됩니다.
- 동시에 여러 스레드에서 동일한 빈 객체에 접근해도 안전하게 사용할 수 있습니다.
- 컨테이너 레벨
- 싱글톤은 Spring IoC 컨테이너 레벨에서 관리됩니다.
- 동일한 컨테이너 내에서 싱글톤 빈 객체의 인스턴스가 공유됩니다.
- 다른 컨테이너에서 동일한 빈 정의를 사용하더라도 별개의 인스턴스가 생성됩니다.
- 지연 초기화(Lazy Initialization)
- 싱글톤 객체는 필요한 시점에서 초기화됩니다.
- 빈 객체가 실제로 사용되기 전까지 생성 및 초기화가 지연됩니다.
- 이를 통해 애플리케이션의 부하를 줄이고 초기화 시간을 최적화할 수 있습니다.
- 프로토타입 빈(Prototype Beans)
- Spring은 싱글톤 이외에도 프로토타입(Prototype) 범위의 빈을 제공합니다.
- 프로토타입 빈은 요청할 때마다 새로운 인스턴스가 생성됩니다.
- 각각의 요청에 대해 별개의 인스턴스를 사용할 수 있습니다.
싱글톤 레지스트리는 Spring의 기본적인 빈 관리 방식 중 하나이며, 애플리케이션의 객체 생성과 관리를 효율적이고 일관성 있게 처리하는 역할을 수행합니다.
🏷️이미지 출처 및 참고한 사이트
Uploaded by N2T