본문 바로가기
BackEnd FrontEnd/SPRING2

DI

by forkballpitch 2017. 9. 27.
728x90
728x90

 

-- 도움이 되는

 앞의 글에서 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 / 게리 막 다니엘 루비오, 조시 롱 지음] 등 을 참고 하도록 하자.

 

출처: http://blog.whitelife.co.kr/13 [White Life Story]

 

출처: <http://blog.whitelife.co.kr/13>

 

 

 

---

 

 

 

 

DI 객체주입을 프레임워크에 맡기는 것입니다.

4) 스프링은 의존성 주입(DI : Dependency Injection)을 지원

   각각의 계층이나 서비스들 간에 의존성 존재할 경우 프레임워크가 서로 연결시켜준다.

 

 2-1) DI의 종류

  * Setter Injection (세터 주입)

  * Construction Injection (생성자 주입)

 

위의 예제 처럼 분리/도킹(부착) 형으로 개발을 하게 되면 각 객체(또는 애플리케이션) 간의 결합도를 낮출수 있으며, DI를 사용하는 목적이 이러한 결합도를 낮추기 위함.

 

스프링에서의 DI의 의미

- 부품들을 생성하고, 제품을 조립해주는 공정과정을 대신해 주는 라이브러리 (역할자)

 

 * 개발 핵심 처리 루틴의 수정 없이 제품(객체) 다른 제품(객체) 쉽게 대체하여 생성 가능하도록 하는 역할을 .

 * 명세서에 따라서 자동적으로 부품을 활용하여 제품을 조립.

 * 생성하기 원하는 객체를 명세서(XML) 기술하고, 부품과 의존성(Dependency)들을 보관하는 일을 처리. 그러한 데이터를 보관하는 공간을 컨테이너라 . (IoC 컨테이너)

 

DI (Dependecy Injection) – 각 class 사이의 의존관계를 빈 설정 정보를 바탕으로 container가 자동적으로 연결해 주는 것을 말함. 따라서 lookup과 관련된 코드들이 오브젝트 내에서 완전히 사라지고 컨테이너에 의존적이지 않은 코드를 작성할 수 있음.

 단지 설정 파일에서 의존관계가 필요하다는 정보를 추가하면 .

1) Setter Injection – 클래스 사이의 의존관계를 연결시키기 위하여 setter 메소드를 이용하는 방법. property tag 사용. 

2) Constructor Injection – 클래스 사이의 의존관계를 연결시키기 위하여 constructor를 이용하는 방법. constructor-arg tag 사용. 

3) Method Injection – 싱글톤(Singleton) 인스턴스와 non singleton 인스턴스의 의존관계를 연결시킬 필요가 있을 때 사용하는 방법.

728x90
728x90

'BackEnd FrontEnd > SPRING2' 카테고리의 다른 글

InitBinder  (0) 2017.09.27