IoC, DI
by SoonYong Hong
Inversion of Control, Dependency Injection
DI
Dependency Injection(의존성 주입)
Dependency
DI를 이해하기 위해서는 Dependency를 먼저 이해해야한다.
다음의 자바 코드를 보자
public class MovieList(){
private MovieFinder finder;
public MovieList() {
this.finder = new MovieFinder();
}
//additional methods go on...
}
movieList를 사용하기 위해서는 movieFinder가 필요하다.
Dependency는 한 객체의 작업을 다른 객체에 의존하여 수행하는 것을 의미한다.
위와 같은 경우는 ‘movieList는 movieFinder에 의존한다’ 라고 표현할 수 있다.
Dependency Injection
public class MovieList(){
private FinderInterface finder; //FinderInterface는 interface이다.
public MovieList(FinderInterface anyFinder) { //anyFinder는 FinderInterface를 구현한 클래스의 객체이다.
this.finder = anyFinder;
}
//additional methods go on...
}
public class mainClass {
public static void main(String[] args){
MovieList movieList = new MovieList(new MovieFinder()); //MovieFinder는 FinderInterface를 구현한 클래스이다.
}
}
MovieList 객체는 FinderInterface에 의존하고 있다.
이렇게 객체 내부에서 의존하고 있는 객체를 생성하지 않고 객체 외부에서 의존하고 있는 객체를 만들어서 객체 내부로 주입을 해주는 것이 DI(의존성 주입)이다.
하지만 객체가 많아진다면 이 모든 객체를 프로그래머가 만들어서 연결해 주는 것은 더욱더 어려워 질 것이다.
그래서 나온 개념이 IoC이다.
IoC
Inversion of Control(역흐름 제어)
Inversion of Control
IoC는 객체와 의존성에 대한 통제를 프로그래머에서 프레임워크로 옮기는 것을 이야기합니다.
public class Injector(){
public ListInterface get(String listName, String FinderName) {
ListInterface list;
FinderInterface finder;
if ("movie".equals(FinderName){
finder = new MovieFinder();
} else if ("book".equals(FinderName) {
finder = new BookFinder();
} else {
return null;
}
if ("movie".equals(listName){
list = new MovieList(finder);
} else if ("book".equals(listName) {
list = new BookList(finder);
} else {
return null;
}
return list;
}
//additional methods go on...
}
public class mainClass {
public static void main(String[] args){
Injector injector = new Injector();
ListInterface list = injector.get("movie", "movie");
}
}
이 코드에서 프로그래머가 movieList 객체를 얻기위하여 직접 만드는 객체는 프레임워크 역할을 하는 Injector 객체 뿐입니다.
나머지 의존성에 대한 설정과 객체를 만드는 것은 프레임워크에서 진행됩니다.
초기의 프레임워크는 이렇게 디자인 되었습니다..
현재의 프레임워크는 xml과
<!-- this is a example -->
<?xml version="1.0" encoding="UTF-8">
<beans>
<bean id="movie" class="com.soonyong.example.movieFinder" ></bean>
<bean id="book" class="com.soonyong.example.bookFinder" ></bean>
</beans>
Web Annotation 등을 이용하여
// this is a example
@Autowired
private String name = 'movie';
원하는 객체에 대한 정보를 프레임워크에 전달합니다.
Subscribe via RSS