★ DI (Dependency Injection)

스프링의 핵심 개념
객체사이의 의존 관계를 자기 자신이 아닌 외부에 의해서 설정된다는 개념이다
스프링에서는 설정파일을 사용하여 손쉽게 객체간의 의존관계를 설정하기에 스프링을 DI컨테이너라고 부르기도 한다.
DI 컨테이너는 어떤 클래스가 필요로 하는 인스턴스를 자동으로 생성, 취득하여 연결시켜주는 역활을 한다.
DI 컨테이너가 인스턴스를 생성하도록 하려면 프로그램 소스 내부에서 new 로 직접 생성하지 않고 설정파일에서 필요로 하는 클래스의 정보를 설정해주어야한다.

스프링은 각 클래스간의 의존관계를 관리하기 위한 방법
- Constructor Injection
- Setter Injection


★ Constructor Injection
: 생성자를 통해서 의존 관계를 연결시키는 것을 말한다.
: 생성자를 통해서 의존 관계를 연결하기 위해서는 XML 설정 파일에서 <bean>요소의 하위요소로
  <constructor-arg>를 추가해야 한다.

1. 객체를 전달할 경우에는 ref요소를 사용

[Foo.java]

public class Foo {
   private Bar bar;

   public Foo(Bar bar){
      this.bar = bar;
   }
}

[applicationContext.xml]

<bean id="foo"   class="Foo">
   <constructor-arg>
      <ref bean="bar" />
   </constructor-arg>
</bean>

<bean id="bar"   class="Bar" />


2. 전달인자가 2개이상인 경우
기본데이터 타입일 경우에는 <value>요소를 사용하여 의존관계를 연결시키기 위한 값을 지정

[Foo.java]
public class Foo {
 public   Foo(int a, String b){...}
}

[applicationContext.xml]

<bean id="foo"   class="Foo">
   <constructor-arg   index="1"   value="Hello" />
   <constructor-arg   index="0">
      <value>25</value>
   </constructor-arg>
</bean>

----------------------------------------------------------------

type 속성을 이용하여 지정

[applicationContext.xml]
<bean id="foo"   class="Foo">
   <constructor-arg   type="int"   value="25" />
   <constructor-arg   type="java.lang.String"   value="Hello" />
</bean>


★ Setter Injection
: setter메소드를 이용하여 의존 관계를 연결시키는 것을 말한다.
: <property>요소의 name 속성을 이용하여 값의 의존 관계를 연결시킬 대상이 되는 필드값을 지정한다

[Foo.java]

public class Foo {
   private Bar bar;

   public void setBar(Bar bar){
      this.bar = bar;
   }
}

[applicationContext.xml]

<bean   id="foo"   class="Foo">
   <property   name="bar"   ref="bar"></property>
</bean>

<bean   id="bar"   class="Bar" />


[실습]
Project : Chapter02
Project : Chapter02_SpringMaven


Project : Chapter02
Package   : sample01
Interface : MessageBean.java
Class     : MessageBeanImpl.java
            HelloSpring.java - main()

src       : applicationContext.xml


[문제 1]
Project    : Chapter02
Package    : sample02
Interface  : Calc.java
추상Method : public void calculate();
Class      : HelloSpring - main()
             CalcAdd.java
             CalcMul.java


[실행결과]
25 + 36 = xx
→ xml에서 CalcAdd를 빈(add)으로 Constructor Injection

25 * 36 = xx
→ xml에서 CalcMul를 빈(mul)으로 Setter Injection

-----------------------------------------

[문제 2]
Project    : Chapter02
Package    : sample03
Field      : name, kor, eng, math, tot, avg
Interface  : SungJuk.java
추상Method : public void calcTot();//총점계산
             public void calcAvg();//평균계산
             public void display();//출력
             public void modify();//수정

Class      : HelloSpring - main()
             SungJukImpl.java
             SungJukDTO.java
            

Constructor Injection를 이용하세요

[실행결과]
이름     국어 영어 수학    총점   평균
홍길동   97 100 95 xxx xx.xx

////////////////////////////////////////////////////

→ 수정하시오 (Setter Injection 이용)
이름 입력 : 코난
국어 입력 : 100
영어 입력 : 100
수학 입력 : 95

이름   국어   영어   수학   총점   평균
코난   100    100     98

-----------------------------------------
Package   : sample04
-----------------------------------------

★ 내용을 파일로 출력

Package    : sample04
Interface  : MessageBean.java
Class      : MessageBeanImpl.java
             HelloSpring.java - main()

Interface : Outputter.java
Class     : FileOutputter.java - 파일로 출력

-------------------------------------------

 

 

 

 

 

 

 

+ Recent posts