Tag Archives: Java

Framework, Spring Framework로 이해하는 DI(1) Page2

오역(誤訳): 방석구

Spring Frameworkで理解するDI(1)
Spring Framework로 이해하는 DI(1)
DI:依存性の注入とは何か?
DI: 의존성 주입(Dependency Injection)이란 무엇인가?


Spring Frameworkを使ったサンプル
Spring Framework을 사용한 샘플


■ Spring Frameworkとは
■ Spring Framework란

 Spring Frameworkは『Expert One-on-One J2EE Design and Development』(邦題『実践 J2EEシステムデザイン』)の著者であるRod Johnson氏が作成したオープンソースのJavaアプリケーションフレームワークです。Spring FrameworkにはDIを実装した「DIコンテナ」がSpringCoreとして実装されています。Spring Frameworkは、商用利用可能なApache License Ver 2.0で提供されています。
 Spring Framework는『Expert One-on-One J2EE Design and Development』 (호다이邦題『실천実践 J2EE System Design』)의 저자인 Rod Johnson씨가 작성한 open source Java 어플리케이션 Framework입니다. Spring Framework에서는 DI를 포함한 「DI container」가 SpringCore로서 구성 되어 있습니다. Spring Framework는 상용으로서 이용 가능한 Apache License Ver2.0으로 제공되고 있습니다.

■ プロパティ値の設定サンプル
■ property의 설정 샘플

 それではSpring Frameworkを使用した、「設定と利用を分離」するサンプルを作成しましよう。まず初めはプロパティの初期値を設定ファイルから読み込んで設定するシンプルなサンプルを作成します。サンプルのクラス構成は以下のようになります。
 그럼 Spring Framework를 사용한, 「설정과 이용을 분리」하는 샘플을 작성해봅시다. 우선 처음은 property의 초기값을 설정 파일부터 읽어 들여 설정하는 심플한 샘플을 작성합니다. 샘플의 클래스 구성은 다음과 같습니다.

 これは、SpringTestクラスのmainメソッドが呼ばれるとTargetクラスに注入された「message」を表示するだけの簡単なサンプルです。まずはSpring Frameworkの配布アーカイブをダウンロードしましょう(http://www.springframework.org)。
 이것은 SpringTest 클래스의 main method가 호출되면 Target클래스에 주입된「message」를 표시하는 간단한 샘플입니다. 우선은 Spring Framework의 배포 archive를 다운로드 해봅시다. (http://www.springframework.org)

 次に、必要なJarファイルをクラスパスに通します。最低限必要なライブラリは以下の2つで、ダウンロードしたSpring Frameworkのアーカイブにも含まれています。
 그리고 나서, 필요한 Jar 파일을 클래스 패스ClassPath에 추가합니다. 최소 필요한 라이브러리library는 이하 2개로, 다운로드한 Spring Framework의 archive에도 포함되어 있습니다.

  • spring.jar
  • commons-logging.jar

주(註): 각 파일의 경로는 다음과 같습니다.
spring-framework-2.0.7distspring.jar
spring-framework-2.0.7libjakarta-commonscommons-logging.jar

Eclipse에서 위 라이브러리를 추가하는 방법은 이전에 번역 했던「Eclipse 3.1을 사용하자! 제2회 Eclipse 3.1의 통합 환경을 능숙하게 사용하자 Page3」의 「서드 파티(Third Part) JAR을 이용하자 – Project 외부의 JAR를 참조」를 참조해서 Preferences의 User Libraries에 Spring Library와 같이 정의 합니다.

등록한 라이브러리를 Spring 프로젝트에서 이용하는 방법은 Package Explor에서 해당 Spring 프로젝트 우 Click – [Properties] → [Java Build Path] → [Libraries] → [Add Library…] 로 표시된 dialog 화면에서 [User Library]를 선택한 후 Next를 누르면 앞서 등록했던 Spring Library가 나옵니다. 이것을 체크한 후 Finish를 클릭하면 마무리 됩니다.

 さて準備が整ったら、以下のクラスを作成してください。
 모든 준비가 갖추어졌다면, 아래의 클래스를 작성해 주세요.

SpringTest.java

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.
ClassPathXmlApplicationContext;

public class SpringTest {
  public static void main(String args[]){
    // アプリケーションコンテキストの取得
    ApplicationContext contxt =
      new ClassPathXmlApplicationContext("applicationContext.xml");

    // Beanの取得
    Target target = (Target)contxt.getBean("target");

    System.out.println( target.getMessage());
  }
}

주(註): 컴파일 시에 ClassPathXmlApplicationContext(“applicationContext.xml”)의 경로를 찾지 못한다면, 아래와 같이 절대경로로 수정 합니다.

//import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

생략

//ApplicationContext contxt = new ClassPathXmlApplicationContext(“/applicationContext.xml”);
ApplicationContext contxt = new FileSystemXmlApplicationContext(“C:/Documents and Settings/Administrator/workspace/Spring2.0/applicationContext.xml”);

Target.java

public class Target {
public Target() {}

private String message;
public String getMessage() { return this.message; }
public void setMessage(String message) { this.message = message; }
}

 クラスが作成できたら、以下のapplicationContext.xmlというファイルを作成します。このapplicationContext.xmlはアプリケーションのクラスパス上に配置してください。
 클래스가 작성 되었다면, 아래의 applicationContext.xml 파일을 작성합니다. 이 applicationContext.xml은 어플리케이션의 ClassPath상에 배치해주세요.

applicationContext.xml




  
    
      Hello World!
    
  

 これでサンプルは完成です。このサンプルを実行すると以下のように表示されます。
 이것으로 샘플은 완성되었습니다. 이 샘플을 실행하면 아래처럼 출력됩니다.

実行結果
실행결과

Hello World!

 applicationContext.xmlで定義された依存情報の注入されたオブジェクトが取得され、 「Hello World!」という文字列が表示されたのが確認できましたね。
 applicationContext.xml에 정의된, 의존정보가 주입된 오브젝트가 취득되어, 「Hello World!」라는 문자열이 표시된 것을 확인할 수 있네요.

■ 関連オブジェクトの注入サンプル
■ 관련 오브젝트의 주입 샘플

 さて、次にもう1つサンプルを作成します。次はSpring Frameworkによって「依存オブジェクト」を注入するところを確認するサンプルです。DIでは「オブジェクト同士の関連」も「設定」であると見なして実装から切り離すことができます。今回のクラス構成は以下のようになっています。
 뒤이어, 또 하나의 샘플을 작성해봅시다. 다음은 Spring Framework에 의해서 「의존 오브젝트」가 주입되는 것을 확인하는 샘플입니다. DI에서는 「오브젝트 사이의 관련」도 「설정」으로 간주해서 코드로부터 분리할 수 있습니다. 이번 클래스 구성은 다음과 같습니다.

SpringTest.java

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.
ClassPathXmlApplicationContext;

public class SpringTest {
  public static void main(String args[]){
    ApplicationContext contxt =
      new ClassPathXmlApplicationContext("applicationContext.xml");
    Parent parent = (Parent)contxt.getBean("parent");
    System.out.println( "親オブジェクトの設定情報:"+
parent.getName());

    Child child = parent.getChild();
    System.out.println( "子オブジェクトの設定情報:" +
child.getName());
  }
}

Child.java

public class Child{
  private String name;
  private Integer no;
  public String getName() { return name; }
  public void setName(String name) { this.name = name; }
  public Integer getNo() { return no; }
  public void setNo(Integer no) { this.no = no; }
}

Parent.java

public class Parent {
  public Parent() {}
  private Child child;
  private String name;

  public Child getChild() { return child; }
  public void setChild(Child child) { this.child = child; }
  public String getName() { return name; }
  public void setName(String name) { this.name = name; }
}

applicationContext.xml




  
    
      子供
    
    
      1
    
  

  
    
      
    
    
      
    
  

 Springのコンテナが、外部ファイルapplicationContext.xmlに従ってParentオブジェクトとChildオブジェクトを組み立てます。そしてSpring FrameworkのApplicationContextが、SpringTestというアプリケーションからの呼び出しに応じて、組み立てられたオブジェクトを返し、親と子のオブジェクトに設定した値を表示します。実行結果は以下のようになります。
 Spring container가 외부 파일 applicationContext.xml을 따라서 Parent 오브젝트와 Child 오브젝트를 구성합니다. 그리고 나서 Spring Framework의 ApplicationContext가, SpringTest라는 어플리케이션으로부터 호출에 응해, 구성된 오브젝트를 반환하고, 아버지와 아들 오브젝트에 설정된 값을 표시합니다. 실행결과는 다음과 같습니다.

実行結果
실행결과

親オブジェクトの設定情報:親
子オブジェクトの設定情報:子供

■「1対多」の関連を持つオブジェクトの注入
■「1대다」의 관련을 가진 오브젝트의 주입

 最後に「1対多」の多重度を持つ関連を注入するサンプルを作成してみましょう。例えば、自動車クラスを作成するには1つの「自動車」オブジェクトに対して、4つの「タイヤ」オブジェクトを作成しなくてはなりません。Spring Framworkではこういった多重度を持つ関連を、java.util.Listインターフェイスを使って注入します。
 마지막으로 「1대다」의 다중도多重度를 가진 관련 오브젝트를 주입하는 샘플을 작성해봅시다. 예를 들어 자동차 클래스를 작성하는 방법은 하나의 「자동차」 오브젝트에 대해서, 4개의 「타이어」 오브젝트를 생성하지 않으면 안됩니다. Spring Framework에서는 이러한 다중도多重度를 가진 관련 오브젝트를, java.util.List 인터페이스interface를 사용해서 주입합니다.

 サンプルではListをループして値を取り出し、標準出力に書き出します。
 샘플에서는 List를 루프로 돌려 값을 추출하고, 표준출력으로 뽑아냅니다.

SpringTest.java

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.
ClassPathXmlApplicationContext;
public class SpringTest {
     public static void main(String args[]){
           ApplicationContext contxt =
                new ClassPathXmlApplicationContext("applicationContext.xml");
           Parent parent = (Parent)contxt.getBean("parent");

           for (int i = 0; i < parent.getManyValues().size(); i++) {
                System.out.println( "1対多の情報:" + parent.getManyValues().get(i));
           }
     }
}

Parent.java

import java.util.List;
public class Parent {
     public Parent() {}

     private List manyValues;
     private String name;

     public String getName() { return name; }
     public void setName(String name) { this.name = name; }
     public List getManyValues() {
           return manyValues;
     }
     public void setManyValues(List manyValues) {
           this.manyValues = manyValues;
     }
}

applicationContext.xml




     
           
                子供
           
           
                1
           
     

     
           
                
                     1番目の値
                     2番目の値
                
           
           
                
           
     

このサンプルの実行結果は以下のようになりました。
 이 샘플의 실행결과는 다음과 같습니다.

実行結果
실행결과

1対多の情報:1番目の値
1対多の情報:2番目の値

 このようにしてSpring FrameworkではDIの原則である「設定を利用から分離する」ことを実現できます。ほかにもSpring Frameworkの機能はたくさんありますが、それらはこの連載の中で追って説明していくことにします。
 이와 같이해서 Spring Framework에서는 DI의 원칙인「설정을 사용으로부터 분리한다」는 것을 실현할 수 있습니다. 그 밖에도 Spring Framework의 기능은 많이 있습니다만, 그것들은 이 연재를 통해서 설명해 나가도록 하겠습니다.

INDEX
제1회 Spring Framework로 이해하는 DI
Page1
Dependency Injection:의존성依存性 주입注入이란?
* Page2
Spring Framework을 사용한 샘플
Page3
컴포넌트component 지향 프로그래밍programming의 촉진

Spring Framework로 이해하는 DI Back number
제1회 DI: 의존성 주입Dependency Injection이란 무엇인가?
제2회 Spring Framework의 설계 사상과 AOP
제3회 Spring AOP 샘플 어플리케이션으로 이해하는 AOP
최종회 왜 DI 컨테이너container를 사용해야 하는가

원문 출처
@IT Java Solution