Spring(스프링), Spring Boot(스프링부트), JSP

스프링(Spring) DI(의존관계주입) 이란?

알통몬_ 2017. 12. 28. 13:30
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


네티를 공부하다가 스프링을 같이 연동해서 사용을 해야해서 스프링을 공부하고 있습니다.


이번 포스팅에서는 DI(의존관계주입) 에 대해서 알아보겠습니다.


의존관계가 먼저 무엇인지에 대해 알아보겠습니다.

세 개의 클래스가 있습니다.

MainClass, Sub1, Sub2


MainClass 는 혼자서 동작하지 못하고, Sub1 과 Sub2 를 의존해서 동작합니다.

즉 Sub1 이나 Sub2 가 변경되거나 무언가 추가가 되거나 형식이 바뀐다면,

그 영향이 MainClass에  전달된다는 것입니다.

대표적 예가 MainClass 에서 Sub1의 메서드를 호출하는 경우입니다.

Sub1의 메서드가 추가되거나 기존 메서드 형식이 변경된다면 그에 따라

MainClass 도 수정되거나 추가되어야 합니다.

이런 경우 MainClass 와 Sub1은 의존관계가 있다고 말 할 수 있습니다.

그리고 의존관계에는 방향성이 있습니다.

여기서 MainClass 는 Sub1에 의존하지만, Sub1은 MainClass에 의존하지 않습니다.


여기서 의존하는 방법에는 두 가지가 있습니다.


첫 번째 우리가 아주 잘 알고 있는 new 연산자를 통해서 

MainClass 내부에 Sub1 객체와 Sub2 객체를 생성해서 사용하는 것입니다.


두 번째는 Sub1과 Sub2 의 객체를 외부에서 만들어서 MainClass에 주입해주는 것입니다.

주입해주는 방법에는 setter 와 constructor 가 있습니다.


스프링에서는 바로 두 번째 방법을 사용합니다.

[ 광고 보고 가시죠! ]



[ 감사합니다! ]



첫 번째 방법의 경우(스프링이 적용되지 않은 방법)

Running.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Running {
 
    public static void main(String[] args) {
 
        MyCalc mCal = new MyCalc(); // 직접 new 연산자로 객체 생성
        mCal.setCalculator(new Calc());
        mCal.setFirstNum(10);
        mCal.setSecondNum(2);
        
        mCal.add();
        mCal.sub();
        mCal.mul();
        mCal.div();
 
    }
 
}
 
cs

Calc.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Calc {
 
    public void add(int f, int s) {
        System.out.println("add()");
        int result = f + s;
        System.out.println(f + " + " + s + " = " + result );
    }
    public void sub(int f, int s) {
        System.out.println("sub()");
        int result = f - s;
        System.out.println(f + " - " + s + " = " + result );
    }
    public void mul(int f, int s) {
        System.out.println("mul()");
        int result = f * s;
        System.out.println(f + " * " + s + " = " + result );
    }
    public void div(int f, int s) {
        System.out.println("div()");
        int result = f / s;
        System.out.println(f + " / " + s + " = " + result );
    }
    
}
 
cs

MyCalc.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class MyCalc {
 
    Calc calculator;
    private int first;
    private int second;
    public MyCalc() {
        
    }
 
    public void add() {
        calculator.add(first, second);
    }
    public void sub() {
        calculator.sub(first, second);
    }
    public void mul() {
        calculator.mul(first, second);
    }
    public void div() {
        calculator.div(first, second);
    }
    
    
    public void setCalculator(Calc calculator) {
        this.calculator = calculator;
    }
    
    public void setFirstNum(int first) {
        this.first = first;
    }
 
    public void setSecondNum(int second) {
        this.second = second;
    }
    
    
    
}
 
cs


이번에는 스프링이 적용된 위에서 말한 두 번째 방법입니다.

Running.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Running {
 
    public static void main(String[] args) {
        
        String configLocation = "classpath:applicationContext.xml";
        AbstractApplicationContext ctx = 
new GenericXmlApplicationContext(configLocation);
        
        MyCalc myCalculator = ctx.getBean("myCalc", MyCalc.class);
        
        myCalculator.add();
        myCalculator.sub();
        myCalculator.mul();
        myCalculator.div();
        
    }
 
}
cs

Calc.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Calc {
 
    public void addition(int f, int s) {
        System.out.println("addition()");
        int result = f + s;
        System.out.println(f + " + " + s + " = " + result );
    }
    public void subraction(int f, int s) {
        System.out.println("subraction()");
        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 );
    }
    
}
cs

MyCalc.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class MyCalc {
 
    Calc calc;
    private int first;
    private int second;
    public MyCalc() {
        
    }
 
    public void add() {
        calc.addition(first, second);
    }
    public void sub() {
        calc.subraction(first, second);
    }
    public void mul() {
        calc.multiplication(first, second);
    }
    public void div() {
        calc.division(first, second);
    }
    
    
    public void setCalc(Calc calc) {
        this.calc = calc;
    }
    
    public void setFirst(int first) {
        this.first = first;
    }
 
    public void setSecond(int second) {
        this.second = second;
    }
    
    
    
}
cs


applicationContext.xml 이파일은 src/main/resources 아래에 생성하시면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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-4.3.xsd">
 
    <bean id="calc" class="org.mon.altong.on.Calc"/>
 
    <bean id="myCalc" class="org.mon.altong.on.MyCalc">
        <property name="calc" ref="calc"/>
        <property name="first" value="10"/>
        <property name="second" value="2"/>
    </bean>
 
</beans>
 
cs


new 연산자 대신에 <bean> 이라는 태그로 객체를 생성합니다.

이 bean을 통해 생성된 객체는 기본적으로 싱글톤입니다.


간단히 알아보았는데요.

다음포스팅에서는 첫 번째 방법과 두 번째 방법의 상관관계와

xml로 DI, Java 코드로 DI 하는 방법에 대해 알아보겠습니다.


이상입니다.

감사합니다.


반응형