IoC(Inversion of Control)
1) IoC/DI 를 적용하지 않을 때
- 작업을 수행하는 쪽에서 Object 생성과 같은 제어 흐름을 결정
ex) 개발자가 직접 new 를 통해 객체를 생성
ex) main()에서 생성된 오브젝트가 다른 오브젝트 생성에 영향을 미침
- 각 오브젝트는 프로그램 흐름 및 사용할 오브젝트 결정에 적극적으로 관여
ex) Foo라는 오브젝트에서 Boo라는 오브젝트가 필요하면 new Boo로 Boo를 선언한다.
2) IoC/DI 개념을 적용했을 때
- 프로그램의 제어는 제어 권한을 위임받는 특별한 오브젝트(컨테이너)가 수행
ex) 컨테이너가 객체를 생성 및 관리
- Object는 자신이 어떻게 생성/관리되는지 알 수 없음(컨테이너에 의해 생성/관리됨)
- Object는 자신이 사용할 Object를 구체적으로 결정할 수 없음(컨테이너가 주입해주는 것 써야함)
DI(Dependency Injection)
- 오브젝트 사이의 의존관계를 컨테이너가 자동으로 관리해 주는 것.
- 사용할 객체를 컨테이너에 등록
-> 어플리케이션 코드에서 해당 객체를 setter함수의 매개변수로 받아와 실행 시에 동적으로 의존관계 설정
-> 이렇게 할 경우 동적으로 구현 클래스를 정해줄 수 있음
- 즉, 객체가 가진 종속성을 어플리케이션 코드 외부(container)에 설정함으로써 결합도는 낮추고 유연성 높임
DI의 3가지 분류
1) Constructor Injection : type 1 IoC
생성자를 통해 의존 객체를 넘겨주는 방법
// PicoContainer
class MovieLister...
public MovieLister(MovieFinder finder) {
this.finder = finder;
}
class ColonMovieFinder...
public ColonMovieFinder(String filename) {
this.filename = filename;
}
2) Setter Injection : type 2 IoC
세터 메소드를 통해 의존성을 주입하는 방법. Spring에서 사용중인 방법.
// Spring Container
class MovieLister...
private MovieFinder finder;
public void setFinder(MovieFinder finder) {
this.finder = finder;
}
class ColonMovieFinder...
public void setFilename(String filename) {
this.filename = filename;
}
3) Interface Injection : type 3 IoC
의존성 주입 함수를 포함하는 인터페이스를 작성하고, 그 인터페이스를 구현하여 의존성을 주입하는 방법
// Avalon
public interface InjectFinder {
void injectFinder(MovieFinder finder);
}
class MovieLister implements InjectFinder...
public void injectFinder(MovieFinder finder) {
this.finder = finder;
}
public interface InjectFinderFilename {
void injectFilename (String filename);
}
class ColonMovieFinder implements MovieFinder, InjectFinderFilename......
public void injectFilename(String filename) {
this.filename = filename;
}
[참조]
세 가지 DI 컨테이너로 향하는 저녁 산책(http://www.nextree.co.kr/p11247/)
Spring - IoC & DI (https://isstory83.tistory.com/91)
'dev > Spring' 카테고리의 다른 글
spring mvc 프로젝트 구조 (0) | 2019.02.19 |
---|---|
Spring Layered Architecture (0) | 2019.02.19 |
Java web MVC (0) | 2019.02.15 |
DTO/DAO, ConnectionPool (0) | 2019.02.15 |
AOP (0) | 2019.02.14 |