ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA/SPRING] DI(Dependency Injeciton, 의존주입)
    개발/Java 2019. 1. 27. 01:10
    6강 DI(Dependency Injeciton)

    6강 DI(Dependency Injeciton)

    DI(Dependency Injection)란?

    1. 배터리 일체형 차배터리가 떨어지면 새로 구입해야한다
    2. 배터리 분리형 로봇배터리만 교체하면 된다.
    3. 배터리 분리형 라디오배터리만 교체하면 된다.

    위 경우에서, 당연히 배터리 분리형이 효율적이다.

    프로그래밍적인 관점에서도 마찬가지이다. 계산기 프로젝트를 진행한다 하였을 때, 모든 기능을 하나의 객체로 만들었으면, 나누기 부분의 기능만 수정하려해도, 전체 프로젝트의 구조를 바꿔야하는 소요가 있다.

    그러나, 각각의 기능마다 객체를 독립시키면, 수정이 용이하다.

    위의 경우에서, 모두 배터리라는 객체에 의존해서, 장난감이 만들어진다.

    그러므로, 배터리에 의존한다. (Dependency Injection = 의존 주입)

    효과적인 의존 주입 방법은, 2번과 3번처럼 따로 분리해서 개발하는 것이 유연하고 좋은 프로그래밍

    위 3가지 경우를 자바코드로 나타낸 경우, 다음과 같다.

    1. 배터리 일체형 카

    public class ElectronicCarToy {

    private Battery battery;

    public ElectronicCarToy() {
    battery = new NormalBattery();
    }

    }

    // 생성자에서 배터리를 주입하므로, 배터리를 교체할 수 없다.
    // 배터리가 떨어지면, 장난감을 새로 구입해야 한다.

    2. 배터리 분리형 로봇

    public class ElectronicRobotToy {

    private Battery battery;

    public ElectronicRobotToy() {

    }

    public void setBattery(Battery battery) {
    this.battery = battery;
    }

    }

    // setter을 통해 배터리를 주입시키므로, 언제든지 원하는 배터리를 넣어서 사용할 수 있다

    3. 배터리 분리형 라디오

    public class ElectronicRadioToy {

    private Battery battery;

    public ElectronicRadioToy(Battery battery) {
    this.battery = battery;
    }

    public void setBattery(Battery battery) {
    this.battery = battery;
    }

    }

    // 생성자를 통해 처음에 배터리가 주입되고, 추후에 setter을 통해 배터리 교체가 가능하다.

    세 경우 모두 배터리 의존 주입을 하지만, 2,3번이 더 효율적인 방법

    예제의 학사정보관리 프로그램에서, StudentAssembler 객체를 생성할 때, studentDao객체를 만들어서, 동일한 객체를 모든 다른 객체에 넣어준다(주입)

    public StudentAssembler() {
    studentDao = new StudentDao();
    registerService = new StudentRegisterService(studentDao);
    modifyService = new StudentModifyService(studentDao);
    deleteService = new StudentDeleteService(studentDao);
    selectService = new StudentSelectService(studentDao);
    allSelectService = new StudentAllSelectService(studentDao);
    }

    registerService, modifyService, deleteService, selectService, allSelectService는 studentDao객체에 의존하고있다. (의존주입이 이루어짐)

    스프링에서의 DI

    객체들은 모두 스프링 컨테이너 안에 모여있으므로, 스프링 컨테이너 안에서 객체가 서로 주입하고 의존하는 관계를 나타낼 수 있음.

    예제의 학사정보관리 프로그램에서 앞선 코드와 다르게, new 키워드를 통해 직접 의존주입을 하지 않고, applicationContext.xml에서 studentDao객체를 만들어서, registerService, modifyService, deleteService, selectService, allSelectService 객체에 주입한다.

    <bean id="studentDao" class="ems.member.dao.StudentDao" ></bean>


       <bean id="registerService" class="ems.member.service.StudentRegisterService">
    <constructor-arg ref="studentDao" ></constructor-arg>
    </bean>

    <bean id="modifyService" class="ems.member.service.StudentModifyService">
    <constructor-arg ref="studentDao" ></constructor-arg>
    </bean>

    <bean id="deleteService" class="ems.member.service.StudentDeleteService">
    <constructor-arg ref="studentDao" ></constructor-arg>
    </bean>

    <bean id="selectService" class="ems.member.service.StudentSelectService">
    <constructor-arg ref="studentDao" ></constructor-arg>
    </bean>

    <bean id="allSelectService" class="ems.member.service.StudentAllSelectService">
    <constructor-arg ref="studentDao" ></constructor-arg>
    </bean>

    스프링에서는, 객체를 스프링 컨테이너에 넣어서 사용할 수 있다.

    constructor-arg : 생성자에 studentDao 객체를 참조한다.(ref)

    GenericXmlApplicationContext ctx = 
    new GenericXmlApplicationContext("classpath:applicationContext.xml");

    new 키워드 대신에, GenericXmlApplicationContext를 통해 applicationContext.xml내의 객체를 가져온다.

    StudentRegisterService registerService = ctx.getBean("registerService", StudentRegisterService.class);

    getBean을 통해 스프링 컨테이너 내의 객체를 가져올 수 있다.


    댓글

Designed by Tistory.