앞의 글에서 Ioc에 대하여 알아 보고, DI(Denpendency Injection), DL(Denpendency Lookup) 에 대하여 간략하게 알아보았다. 이번에는 DI(Denpendency Injection) 을 상세하게 알아보도록 한다.

 DI(Denpendency Injection) 는 크게 3가지로 볼 수 있다. 아래의 그림을 보도록 하자.

 



 

 Spring Ioc 글에서 사용했던 예제를 활용 한다. 아래의 표는 Annotation 기반의 @Autowired 기준으로만 설명 한다. @Autowired는 선언을 한 경우, Constructor, Method에 Instance를 주입 한다. 찾지 못한 경우 예외를 발생 시킨다.

  구분

  설명 

 Setter Injection

 

 @Autowired
 public void setService(Wservice service) {
  this.service = service;
 }

 Setter Method에 직접 선언을 하였다. Container는 Instance를 생성 할 때 @Autowired 가 Setter Method에 선언이 되어 있을 경우, Parameter로 있는 Object(Wservice) 를 target으로 주입하게 된다.

 

 Constructor Injection

 

 @Autowired
 public Wcontroller(Wservice wservice) {
  // TODO Auto-generated constructor stub
  this.service = wservice;
 } 

 Constructor에 직접 선언을 하였다. Container는 Instance를 생성 할 때 @Autowired 가 Constructor에 선언이 되어 있을 경우, Parameter로 있는 Object (Wservice) 를 target으로 주입하게 된다.

 

 Method Injection

 

 Setter Injection과 동일 하다고 볼 수 있다. 결국엔 Setter도 Method에 포함 되기 때문이다.

 

 위의 표를 보고 코드를 변경하여 실행을 하면 같은 결과를 확인 해볼 수 있을 것이다.

 실제로 ApplicationContext Container에 적용을 할 경우에는 2가지 방법으로 적용을 할 수가 있다.

  • XML

  • Annotation

 XML의 경우에는 Container의 Config 파일에 직접 명시를 하는 것이고, Annotation의 경우에는 Java 코드에 직접 명시를 하는 경우이다. 지금 까지 예제로 작성 했던 모든 부분 및 Spring Ioc 글에서 설명 했던 예제는 Annotation 기반 이였다. 예제 코드를 작성하기도 쉽고, 간단했기 때문이다. 이번에는 XML로 설명 하겠다.

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
    http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.1.xsd">

 <bean class="kr.whitelife.controller.Wcontroller">
  <constructor-arg ref="service"/>
 </bean>

 
 <bean id="service" class="kr.whitelife.service.Wservice">
  <property name="dao" ref="dao"></property>
 </bean>
 
 <bean id="dao" class="kr.whitelife.dao.Wdao"/>
 
</beans>

 

 위의 XML을 보도록 하자.  Container의 Config 파일인 ApplicationContext.xml 이다. Spring Ioc 글에서 사용 하였던 Class를 설정 하는 부분이다. Class의 설정 태그는 <bean .../> 을 이용 한다. 많이 사용하는 속성은 아래의 표를 보도록 하자.

  속성

  설명 

  constructor-arg

  Class 전체 Package 명 작성 및 bean Id

  property

  Class 전체 Package 명 작성 및 bean Id

 Constructor Injection은 <constructor-arg .../> 을 이용한다. Instance가 생성 되는 시점에서 Container에게 해당 Instance를 참조 하겠다 라고, 전해주지 않을 경우 Constructor가 참조하는 Instance를 찾을 수 없기 때문에 동작 할 수 없다. Setter Injection, Method Injection의 경우에는 <property .../> 를 이용 한다.  Constructor Injection 설명과 마찬가지로 Container에게 참조할 Instance를 전해주지 않는 경우 동작 할 수 없다.

 XML 기반으로 작성 할 경우에는 3가지의 Injection 중 어떤 기법을 사용할지 잘 판단 하고, 작성 하도록 한다. 실행 할 경우 예외가 발생한다고 해서 당황하지 말자. 예외를 잘 읽어보면 Container 에게 정보 전달을 확실하게 하지 않았기 때문에 일어나는 경우가 대부분이다.

 

public class XapplicationContext {
 
 public static void main(String[] args) {
  
  ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
  Wcontroller wcontroller = applicationContext.getBean(Wcontroller.class);
  wcontroller.showMsg();
  
 }
 
}

 

 Spring Ioc 글에서 사용했던 예제는 Annotation 기반의 Container를 작성 했었다. 이번에는 XML 기반의 Contatiner를 작성 해보았다. 위의 코드를 실행 해보자.

 

Wcontroller.showMsg....
Wservice.showMsg....
Wdao.showMsg....

 

 XML 설정을 확실하게 했다면, 위와 같은 결과를 얻을 수 있을 것이다. Container가 예외를 발생 시킬 경우 Container의 Config 파일인 ApplicationContext.xml을 다시 확인 하도록 하자.

 드디어 간략하게 DI(Denpendency Injection)을 XML, Annotation 기반으로 체험을 해보았다. 상세한 설정이나 고급적인 DI를 할 필요성이 있을 경우 [Spring IN ACTION / 크레이그 월즈 지음], [Spring Recipes / 게리 막 다니엘 루비오, 조시 롱 지음] 등 을 참고 하도록 하자.

 

+ Recent posts