on
[인강정리] 03. IoC 컨테이너와 DI
[인강정리] 03. IoC 컨테이너와 DI
1. IoC (Inversion of Control)
- 제어권의 역전.
- 객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다는 것을 뜻함.
- 개발자가 아닌 컨테이너가 관리해줌.
왼쪽은 기존의 new 객체 방식 / 오른쪽은 설정이 소스코드에 객체를 주입해 주는 것
1-1 IoC 컨테이너
- 객체의 생성을 책임지고, 의존성을 관리함.
- POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 가짐.
- 개발자들이 직접 POJO를 생성할 수 있지만 컨테이너에게 맡김.
1-2 IoC 의 분류
DL보다는 DI를 선호함.
DL
- 의존성 검색
- 저장소에 저장되어 있는 Bean에 접근하기 위해 컨테이너가 제공하는 API를 이용하여 Bean을 검색.
- DL을 사용하면 컨테이너 종속성이 증가함. ==> DI를 주로 사용하게 되는 이유
DI
- 의존성 주입
- 각 클래스 간의 의존관계를 Bean Definition 정보를 바탕으로 컨테이너가 '자동으로' 연결해주는 것.
2. DI
- 빈 설정파일에서 의존관계가 필요하다는 정보만 추가하면 된다.
- 객체 레퍼런스를 컨테이너로부터 주입받아서, 실행 시에 동적으로 의존관계가 생성됨
- 컨테이너가 흐름의 주체가 되어 애플리케이션 코드에 의존관계를 주입해 주는 것.
==> 코드가 단순해지고, 컴포넌트 간의 결합도가 낮아져서 좋다.
2-1 DI의 유형
1) Setter Injection
Setter 메서드를 만들고 이를 통해 의존성을 주입
2) Constructor Injection
필요한 의존성을 포함하는 클래스의 생성자를 만들고 이를 통해 의존성을 주입
3) Method Injection
의존성을 입력 받는 일반 메서드를 만들고 이를 통해 의존성을 주입
Hello라는 클래스가 String Printer / Console Printer 중 어떤 것을 구현할 지 beans.xml 설정 파일이 알려줌.
beans.xml 에서 Hello 클래스가 printer 인터페이스에 의존하는 데, printer 인터페이스는 StringPrinter로 구현되어 있다는 것을 알 수 있음. Hello 클래스는 setter 메서드로 name과 printer를 주입 받음. Hello 클래스 안에 Hello(String name, Printer printer) 라는 인자 생성자가 있다. beans.xml에서 constructor arg 태그의 index 속성을 통해 각 인자에 값을 주입해준다.
3. Spring DI 컨테이너
- Spring DI 커넽이너가 관리하는 객체를 빈이라고 하고, 이 빈들을 관리한다는 의미로 컨테이너를 빈 팩토리라고 부른다.
- BeanFactory에 여러가지 컨테이너 기능을 추가하여 ApplicationContext라 부름.
3-1 BeanFactory와 ApplicationContext
BeanFactory
- 빈 등록, 생성, 조회, 반환을 관리함.
- getBean() 메서드가 정의되어 있음
ApplicationContext
- BeanFactory의 기능에 여러 부가 서비스가 추가되어 있음.
ApplicationContext가 DI 컨테이너의 기능을 수행한다고 볼 수 있다.
from http://purewater-practice-diary.tistory.com/57 by ccl(A) rewrite - 2021-12-24 16:27:18