원문사이트 : Martin fowler - Inversion of Control Containers and the Dependency Injection pattern

http://martinfowler.com/articles/injection.html

Inversion of Control Containers and the Dependency Injection pattern

( 통제 구역의 반전 과 의존성 주입 패턴 )

자바 커뮤니티에는 수많은 프로젝트을 가지고 응집된 어플리케이션을 위한 컴포넌트를 구성하도록 도와주는 경량의 컨테이너가 다양하게 나타났습니다.

이러한 컨테이너가 가진 기본적이고 공통된 패턴은 그들은 어떻게 연결시킬수 있는지에 대한 것입니다.

Inversion of control, Dependency Injection, Service Locator

Components and Services

컴포넌트은 변경없이 어플리케이션이 사용할수 있도록 고안되어진 소프트웨어의 묶음을 의미합니다.

여기서 변경없이는 어플리케이션이 컴포넌트의 소스를 바꿀수 없다는 뜻이고 행동은 바꿀수 있다를 의미합니다.

서비스는 외부 어플리케이션에 의해 사용되어질수 있는 컴포넌트를 의미합니다.


순진한 예제

특별한 감독이 제작한 영화 목록을 제공하는 컴포넌트를 작성할려고 합니다.

class MovieLister ...

  public Movie[] moivesDiretedBy( String arg ) {

    List allMovies = finder.findAll();

    for ( Iterator it = allMovies.iterator() ; it.hasNext(); ) {

      Movie movie = (Movie) it.next();

      if (!movie.getDirector().equals(arg)) it.remove();

   }

   return ( Movie[] ) allMovies.toArray( new Movie[Movies.size()])

}

이 기사의 핵심은 Finder 오브젝트 입니다. 특히 우리가 어떻게 리스트 오브젝트를 하나의 특별한 finder 오브젝트를 연결시킬것인지 입니다.  이게 왜 흥미로운것이야 하면 나는 나의 사랑스러운  moviesDirectedBy 메소드가 저장된 모든 영화들로 부터 완전히 독립되어지기를 원하기 때문입니다.

모든영화정보를 가져오는 인터페이스를 작성합니다.

public interface MovieFinder {

  List findAll();

}

이 인터페이스를 사용하는 실제 클래스를 작성해 봅니다.

class MovieLister ...

  private MovieFinder finder;

  public MovieLister() {

finder = new ColonDelimitedMovieFinder("movies1.txt");

 }

이 인터페이스로 인해서 영화를 콜론으로 텍스트파일을 작성해서 처리할수 있는 멋진 프로그램이 되었습니다.

나의 동료들도 충분히 이 프로그램을 사용할수 있어서 더욱 멋지게 보입니다.

그러나 다른형태로 저장된 영화리스틀 파일들은 어떻게 해야 할까요? sql database, xml file, web service, other text file.

이러한 경우에 우리는 이 형태에 맞는것을 처리할수 있는 또다른 클래스를 필요로 합니다.

Figure 1

Figure 1: The dependencies using a simple creation in the lister class

이것은 plugin 개념과 비슷할 것입니다.

여기서 핵심은 이러한 프로그램들을 어떻게 어플리케이션으로 모을수 있느냐 하는 것입니다. 

경량의 컨테이너가 이것을 구현하기 위해서 필요한 것인 Inversion Of Control 입니다.

Inversion Of Control

프레임워크의 일반적인 특징입니다. 따라서 경량 컨테이너가 inversion of control 을 사용하기 때문에 특별하다고 말하는 것은 내차가 휠을 가지고 있기때문에 특별하다고 말하는 것과 별반 차이가 없습니다.

문제는 통제의 어떤 관점을 그들이 도치하고 있느냐 하는 것입니다. 내가 처음 접했던 것은 유저 인터페이스의 메인 통제에서 였습니다. 초기의 유저 인터페이스는 어플리케이션 프로그램에 의해 통제되어졌습니다. 당신의 일련의 명령을 가집니다. 성명을 기입하시오. 주소을 입력하시요. 당신의 프로그램은 프람프트로 이끌고 각 항목의 응답을 가져가는 식으로 흘러갑니다.

GUI환경에서 UI프레임워크는 주된 흐름을 포함하고 대신에 당신의 프로그램은 각 항목을 위해 이벤트핸들러를 제공합니다.

프로그램의 주된 통제가 프레임워크에서 벗어나서 도치되어진 것입니다.

새로운 형식의 컨테이너에서 Inversion은 그들이 어떻게 플러그인 구현체를 찾는냐에 대한 것입니다.

나의 예제에서 lister 는 finder 구현체를 직접 그것을 인스턴스화 해서 찾았습니다.

이러한 형식은 finder를 하나의 플러그인이 될수 없도록 만듭니다.

컨테이너가 사용하는 접근법은 플러그인의 사용자가 규약을 따르는것을 보장합니다. 이 규약은 분리된 어셈블러 모듈이 구현을 lister 에 주입할수 있도록 허락하는 것입니다.

용어상에서 혼란이 생길것 같아서 Inversion of control 을 Dependency Injection 으로 사용하고자 합니다.

어플리케이션에서 의존성을 제거하는 방법으로 Dependency Injection 그리고 Service Locator 가 있습니다.

Forms of Dependency Injection

Figure 2

Figure 2: The dependencies for a Dependency Injector

Constructor Injection with PicoContainer

Setter Injection with Spring

Interface Injection with Avalon


블로그 이미지

희망잡이

,