신규 블로그를 만들었습니다!

2020년 이후부터는 아래 블로그에서 활동합니다.

댓글로 질문 주셔도 확인하기 어려울 수 있습니다.

>> https://bluemiv.tistory.com/

DI(Dependency Injection) 

스프링의 DI(Dependency Injection) 에 대해서 알아보겠습니다.

 

 

보통 프로젝트를 만들면, 여러개의 객체를 이용해서 만들게 됩니다.

 

 

 

예를들어, Main, Calculator, MyCalculator 라는 객체가 있습니다.

 

Main 객체가 Calculator, MyCalculato객체를 이용을 할때,

Main객체는 Calculator, MyCalculator객체에 의존한다고 합니다.

 

 

그렇다면, Main 함수에서 Calculator, MyCalculator 객체들을 가지고 올때, 어떻게 할까요?

 

MyCalculator myCalculator = new MyCalculator();
Calculator Calculator = new Calculator();

 

위와 같이 할 것 입니다. 물론 틀린것은 아니지만,

 

스프링에서는 setter() 함수와 constructor() 생성자 함수를 이용해서

외부의 객체들을 가져옵니다.

 

 

이러한 방법을 의존성 주입 (Dependency Injection) 이라고 합니다.

 

 

 

이러한 방법을 예제를 통해 알아보도록 하겠습니다.

 

 

 

 

 

일단 프로젝트를 생성합니다.

 

저의 경우 Mac OS에서 하고 있기 때문에 인터페이스 약간은 다를 수 도 있습니다.

 

 

 



 

간단히 DI에 대해서 알아볼거라 Simple Spring Maven 으로 프로젝트를 생성 하겠습니다.

 

이름은 원하시는 걸로 아무거나 하셔도 됩니다.

 

 

 

 

 

 

그리고 총 4개의 파일을 만듭니다.

 

 

Main.java

MyCalculator.java

Calculator.java

applicationCTX.xml

 

 

코드 살펴보기

 

Calculator.java

package com.di.ex;
 
public class Calculator {
 
    public void calc_add(int num1, int num2) {
        System.out.println("add");
        int result = num1 + num2;
        System.out.println(num1 + "+" + num2 + "=" + result);
    }
 
    public void calc_sub(int num1, int num2) {
        System.out.println("sub");
        int result = num1 - num2;
        System.out.println(num1 + "-" + num2 + "=" + result);
    }
 
    public void calc_mul(int num1, int num2) {
        System.out.println("mul");
        int result = num1 * num2;
        System.out.println(num1 + "X" + num2 + "=" + result);
    }
 
    public void calc_div(int num1, int num2) {
        System.out.println("div");
        int result = num1 / num2;
        System.out.println(num1 + "/" + num2 + "=" + result);
    }
}
​

 

 

MyCalculator.java

 

package com.di.ex;
 
public class MyCalculator {
 
    private Calculator calculator;
    private int firstNum = 0;
    private int secondNum = 0;
 
    // set, get method
    public Calculator getCalculator() {
        return calculator;
    }
 
    public void setCalculator(Calculator calculator) {
        this.calculator = calculator;
    }
 
    public int getFirstNum() {
        return firstNum;
    }
 
    public void setFirstNum(int firstNum) {
        this.firstNum = firstNum;
    }
 
    public int getSecondNum() {
        return secondNum;
    }
 
    public void setSecondNum(int secondNum) {
        this.secondNum = secondNum;
    }
 
    // calculator
    public void add() {
        calculator.calc_add(firstNum, secondNum);
    }
 
    public void sub() {
        calculator.calc_sub(firstNum, secondNum);
    }
 
    public void mul() {
        calculator.calc_mul(firstNum, secondNum);
    }
 
    public void div() {
        calculator.calc_div(firstNum, secondNum);
    }
}

 

applicationCTX.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    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.xsd">
 
    <bean id="calculator" class="com.di.ex.Calculator" />
    <bean id="myCalculator" class="com.di.ex.MyCalculator">
        <property name="calculator">
            <ref bean="calculator" />
        </property>
        <property name="firstNum" value="5" />
        <property name="secondNum" value="3" />
    </bean>
</beans>​

 

 

xml 파일에 Calculator, MyCalculator 의 bean을 생성합니다.

 

Main.java

package com.di.ex;
 
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
 
public class Main {
 
    public static void main(String[] args) {
 
        // xml 파일 위치
        String configLocation = "classpath:applicationCTX.xml";
        // xml 파일 가져오기
        AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLocation);
        // MyCalculator 객체 가져오기
        MyCalculator myCalculator = ctx.getBean("myCalculator", MyCalculator.class);
        
        myCalculator.add();
        myCalculator.sub();
        myCalculator.div();
        myCalculator.mul();
    }
}​

 

 

Main 클래스에서 AbstractApplicationContext 와 GenericXmlApplicationContext를 이용해서

applicationCTX.xml 파일을 가져옵니다.

 

그리고 getBean() 함수를 이용해서 MyCalculator 객체를 가져옵니다.

 

 

딱 보기에도 기존 방법과는 다른 것을 알 수 있고,

이러한 방식을 DI 의존성 주입이라 합니다.

 

 

 

 

== 추가 내용 (18.03.10) ==

DI 사용하는 이유

간단한 프로젝트를 만들때는 DI 사용하는지 모를 있다.

복잡하다고 느낄 있다. 쓰는 이유는 유지 관리가 편하기 때문이다.

(마치 java에서 interface 쓰는 이유와 비슷하다.)

 

 

프로젝트 규모가 커질수록 Spring 사용하는 이유를 더욱 깨닫게 이다.

 

 

 

※ 이 글은 Seoul Wiz - '실전 Spring 강좌'를 요약하여 작성하였습니다.

>> 유튜브 - SeoulWiz 

 

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기