아무거나

[spring] DI(Dependency Injection) - 1 본문

Java & Kotlin/Spring

[spring] DI(Dependency Injection) - 1

전봉근 2019. 12. 25. 21:45
반응형

[ DI(Dependency Injection) 와 IOC컨테이너 ]

 

정의) A객체는 B/C 객체에 의존한다.

 

방법 1)

어떤 A라는 객체가 있는데 그 객체가 다른 객체를 필요로할때 new라는 연산자를 사용해서 A라는 객체가 직접 생성한다.

ex) new B();

    new C();

 

방법2)

어떤 A라는 객체가 있는데 B라는 객체와 C라는 객체가 필요로 할 때 A라는 객체가 방법1과 다르게

A라는 객체안에 필드를 만들어 놓는다. b,c 

그럼 b,c라는 필드에 대해서 setter() or construct()(=생성자)

생성자일경우 this.b = 매개변수 방식으로 표현한다.

즉, B,C객체를 외부에서 생성해서 A객체가 갖고있는 setter() 또는 생성하는 시점에 construct() 넣어준다. 

 

 

spring [ IOC컨테이너(new B(), new C(), new X()....)  -> A객체(setter() or construct())  ]

즉, spring이란 부품을 생성하고 조립하는 라이브러리의 집합체

ex) 부품(=new B()) 

 

 

1. 스프링을 이용한 객체 생성과 조립

 

   [공통 소스]

 

   # MyCalculator.java)

public class MyCalculator {
    Calculator calculator;
    
    private int firstNum;
    private int secondNum;

    public MyCalculator() {}

    public void add() {
    	calculator.addition(firstNum, secondNum);
    }

    public void sub() {
    	calculator.subtraction(firstNum, secondNum);
    }

    public void mul() {
    	calculator.multiplication(firstNum, secondNum);
    }

    public void div() {
    	calculator.division(firstNum, secondNum);
    }

    public void setCalculator(Calculator calculator) {
    	this.calculator = calculator;
    }

    public void setFirstNum(int firstNum) {
    	this.firstNum = firstNum;
    }

    public void setSecondNum(int secondNum) {
	    this.secondNum = secondNum;
    }
}

 

   # Calculator.java)

public class Calculator {
    public void addition(int f, int s) {
        System.out.println("addition()");
        int result = f + s;
        System.out.println(f + " + " + s + " = " + result);
    }

    public void subtraction(int f, int s) {
        System.out.println("subtraction()");
        int result = f - s;
        System.out.println(f + " - " + s + " = " + result);
    }

    public void multiplication(int f, int s) {
        System.out.println("multiplication()");
        int result = f * s;
        System.out.println(f + " * " + s + " = " + result);
    }

    public void division(int f, int s) {
        System.out.println("division()");
        int result = f / s;
        System.out.println(f + " / " + s + " = " + result);
    }
}

 

 

 

   [#1. 스프링 특징이 적용되지 않는 소스]

   

   # MainClass.java)

public class MainClass {
    public static void main(String[] args) {
        MyCalculator myCalculator = new MyCalculator();
        myCalculator.setCalculator(new Calculator());

        myCalculator.setFirstNum(10);
        myCalculator.setSecondNum(2);

        myCalculator.add();
        myCalculator.sub();
        myCalculator.mul();
        myCalculator.div();
    }
}

 

   [#2. 스프링 특징이 적용된 소스]

 

   # MainClass.java)

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
    public static void main(String[] args) {
        String configLocation = "classpath:applicationCTX.xml";  // 해당 xml파일에서 bean객체를 가져옴
        AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLocation);
        MyCalculator myCalculator = ctx.getBean("myCalculator", MyCalculator.class);

        myCalculator.add();
        myCalculator.sub();
        myCalculator.mul();
        myCalculator.div();
    }
}

 

   # /src/main/resources/applicationCTX.xml)  // 오른쪽클릭 -> new -> spring configuration file 에서 생성

<?xml version="1.0" encoding="UTF-8"?>
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.javalec.ex.Calculator" />

<!-- MyCalculator.java의 필드를 선언해 주어야한다. -->
<bean id="myCalculator" class="com.javalec.ex.MyCalculator"> 
    <property name="calculator"> <!-- Calculator 필드 -->
    <ref bean="calculator"/> <!-- Calculator.java 객체를 참조 -->
    </property>
    <property name="firstNum" value="10" />  <!-- 값 주입: 10 -->
    <property name="secondNum" value="2"></property> <!-- 값 주입: 2 -->
</bean>
</beans>

 

* <bean id=""  // 변수설정

  class="com.javalec.ex.MyCalculator" /> // 객체 생성(반드시 풀네임을 다 써줘야 한다.)

          setter함수는 무조건 존재해야 한다.(xml에서 bean을 생성해서 만들때 반드시 setter가 존재하여야한다.)

 

 

참고: https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%94%84%EB%A7%81-%EA%B0%95%EC%A2%8C/dashboard

반응형
Comments