영권's
IoC, DI, Application Context 본문
IoC
Inversion of Control의 약자로 "제어의 역전"을 뜻하는데 객체의 생성부터 호출, 관리등을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미합니다.또한 DI(Dependency Injection)이라고도 합니다.
IoC에서 객체를 생성하고 종속성을 정의하는 과정은 객체를 생성자 인수, 팩토리 메서드에 대한 인수 또는 팩토리 메서드에서 반환된 객체 인스턴스에 설정 Properties들을 통해서만 가능합니다.
그런 다음 컨테이너는 빈을 생성할 때 이러한 종속성을 주입합니다.
이 과정은 기본적으로 클래스를 직접 인스턴스화 하는 방법과는 반대입니다.
org.springframework.beans및 org.springframework.context패키지는 Spring 프레임 워크의 IoC 컨테이너의 기초입니다.
BeanFactory인터페이스는 모든 유형의 개체를 관리 할 수 있는 구성 메커니즘을 제공합니다.
위의 그림에서 볼 수 있듯이 실제 ApplicaitonContext는 BeanFactory를 상속하는데 객체에 대한 생성, 조합, 의존관계설정 등을 제어하는 IoC 기본기능을 BeanFactory에 담당합니다.
ApplicationContext는 BeanFactory에서 다음과 같은 기능이 추가됩니다.
- Spring의 AOP 기능과 더 쉽게 통합
- 메시지 리소스 처리(국제화용)
- 이벤트 발행
- WebApplicationContext 웹 애플리케이션에서 사용 하기 위한 것과 같은 애플리케이션 계층 특정 컨텍스트 .
즉 BeanFactory는 구성하는데 필용한 뼈대과 기본 기능을 제공하고 ApplicationContext는 더 많은 엔터프라이즈 별 기능을 추가합니다.
Bean
스프링에서는 애플리케이션을 형성하고 스프링 IoC 컨테이너에 의해 관리되는 객체를 Bean이라고 합니다.
Bean과 Bean의 종속성은 컨테이너가 사용하는 구성을 위한 메타데이터에 반영이 됩니다.
Bean Scopes
Bean의 정의는 클래스의 정의와 마찬가지로 하나의 빈 정의를 통해 많은 객체 인스턴스를 만들 수 있습니다.
특정 빈 정의에서 생성된 객체에 연결할 다양한 종속성과 구성 값을 제어할 수 있을 뿐만 아니라 특정 빈 정의에서 생성된 객체의 범위도 제어할 수 있습니다.
Bean은 생성 시 여러 Scope을 사용할 수 있는데 그 중 하나로 사용하도록 할 수 있습니다.
Spring Framework는 6가지 범위를 지원하며, 이 중 4개는 Web-Aware ApplicationContext를 사용하는 경우에만 사용할 수 있습니다. 사용자 정의 범위를 만들 수도 있습니다.
그 중 Singleton Scope가 기본 값인데 각 Spring IoC 컨테이너에서는 타입하나당 하나의 객체 인스턴스를 생성하도록 합니다.
Singleton Scope
싱글톤 빈의 하나의 공유 인스턴스만 관리되며 해당 빈 정의와 일치하는 ID 또는 ID를 가진 빈에 대한 모든 요청은 Spring 컨테이너에서 반환되는 하나의 특정 빈 인스턴스로 귀결됩니다.
다시 말해, 빈을 정의하고 싱글톤으로 범위가 지정되면 Spring IoC 컨테이너는 해당 빈 정의에 의해 정의된 객체의 인스턴스를 정확히 하나만 생성합니다.
Spring의 싱글톤 빈 개념은 GoF(Gang of Four) 패턴 책에 정의된 싱글톤 패턴과 다릅니다.
GoF 싱글톤은 특정 클래스의 하나의 인스턴스만 ClassLoader당 생성되도록 개체의 범위를 하드 코딩합니다. (ClassLoader 당 해당 타입의 객체를 하나만 생성하도록 함)
단일 Spring 컨테이너의 특정 클래스에 대해 하나의 빈을 정의하면 Spring 컨테이너는 해당 빈 정의에 의해 정의된 클래스의 인스턴스를 하나만 생성합니다.(Spring 컨테이너 당 해당 타입의 객체를 하나만 생성하도록)
Bean 추가 설명 : https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-definition
Container Overview
org.springframework.context.ApplicationContext인터페이스는 Spring IoC 컨테이너를 나타내며, 인스턴스 구성 및 Bean 조립을 담당합니다. 컨테이너는 구성 메타데이터를 읽어 인스턴스화, 구성 및 어셈블 할 개체에 대한 지침을 얻습니다.
spring 컨테이너에서 다른 형태의 메타데이터를 사용하는 방법에 대한 정보는 다음을 참조하세요.
- 주석 기반 구성 : Spring 2.5는 주석 기반 구성 메타데이터에 대한 지원을 도입했습니다.
- Java 기반 구성 : Spring 3.0부터 Spring JavaConfig 프로젝트에서 제공하는 많은 기능이 핵심 Spring Framework의 일부가 되었습니다. 따라서 XML 파일 대신 Java를 사용하여 애플리케이션 클래스 외부에 Bean을 정의할 수 있습니다. 이러한 새 기능을 사용하려면 다음을 참조하세요. @Configuration, @Bean, @Import, 및 @DependsOn
Dependency Injection
의존성 주입(DI)은 객체가 생성자 인수, 팩토리 메서드에 대한 인수 또는 팩토리 메서드에서 반환된 후 객체 인스턴스에 설정된 속성을 통해서만 객체의 의존성(즉, 객체가 작동하는 다른 객체)을 정의하는 프로세스이다.
그 다음 컨테이너에서 Bean을 생성할 때 이러한 의존성을 주입합니다.
이 프로세스는 기본적으로 클래스의 직접 구성이나 서비스 로케이터 패턴을 사용하여 Bean 자체의 인스턴스화 또는 종속성의 위치를 제어하는 Bean 자체의 반대(이러한 이유로 IoC라고 함.)이다.
그리고 어떤 객체가 다른 객체를 어떻게 객체를 생성할지 스스로 결정하지 않고 생성자를 통해서 객체를 주입받는 패턴을 생성자 주입 패턴(Constructor Dependency Injection) 이라고 부릅니다.
그 외에도 스프링은 세터 기반의 의존관계 주입도 지원합니다.
※ 참고 문헌에 첨부한 원문을 읽으시는 것을 추천드립니다.
참고 문헌 :
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html
'자바 > Spring' 카테고리의 다른 글
ServletContext, ApplicationContext, WebApplicationContext (1) | 2021.11.08 |
---|---|
Spring initializr (0) | 2021.08.17 |