본문으로 바로가기
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


DI는 Dependency Injection의 약자로, 우리말로는 의존 주입이라고 주로 번역하는데 이 단어의 의미를 이해하려면 먼저 "의존"이 무엇인가에 대해서 이해가 필요하다. 의존은 UML을 공부하거나 디자인 패턴을 공부했다면 알고 있을 수 있으나 신입일 경우에는 모를수도 있다. 


여담이지만 스프링을 공부하려면 디자인 패턴을 공부하는 것이 매우 좋을 듯하다. 왜나하면 스프링이 디자인 패턴을 토대로 만들어진 프레임워크이기 때문이다. DI도 어떻게 보면 디자인 패턴에서 나온 하나의 결과물이라고 할 수 있다.


다시 돌아와서 의존이란 무엇일까 ? 의존은 한 클래스가 다른 클래스의 메서드를 실행할 때 이를 "의존" 한다고 한다. 의존의 예를 들자면 아래와 같다. 아래 자동차는 본체와, 엔진, 타이어 객체가 있어야 기능을 할 수 있고, 본체와 엔진, 타이어 객체의 속성과 메소드가 있어야 동작할 수 있다. 이 것을 의존 관계라고 할 수 있다.


1
2
3
4
5
6
7
8
9
10
class Car {
    Body body = new Body();
    Engine engine = new Engine();
    Tire tire = new Tire();

}
 
class Body { /*본체에 대한 속성과 메서드가 있다고 가정하자. */}
class Engine { /*엔진에 대한 속성과 메서드가 있다고 가정하자. */}
class Tire { /*바퀴에 대한 속성과 메서드가 있다고 가정하자. */}



그렇다면 의존 주입은 어떻게 해야할까 ? 간단한 자바 코드로 보면 아래와 같다. 객체 안에서 사용되는 다른 객체들을 생성자 또는 set 메서드로 주입받아 사용하는 것을 의존 주입이라고 한다.


1
2
3
4
5
6
7
8
9
10
11
class Car {
    Body body;
    Engine engine;
    Tire tire;
    
    public Car(Body body, Engine engine, Tire tire) {
        this.body = body;
        this.engine = engine;
        this.tire = tire;
    }
}



뭔가 더 복잡해 보일 수가 있고, 코드가 더 길어진 것 같은데 왜 의존하는 객체를 주입해야하는걸까 이해 못할수가 있다. 이 부분은 위에서 말했다 시피 객체지향의 이해 그리고 디자인 패턴에 대해서 알아야 한다. 또한 Solid의 DIP를 이해하면 더더욱 좋다. DIP에 대해 알고 싶으면 여기링크를 클릭하면 된다.


간단하게 아래 예제로 설명하자면 아래에 차와 오토바이가 있는데 차와 오토바이의 엔진이 다른 것으로 바꼇다고 한다면 class 안에 있는 Engine를 하나하나 수정해 주어야 한다.


1
2
3
4
5
6
7
8
9
10
11
class Car {
    Body body = new Body();
    Engine engine = new Engine();
    Tire tire = new Tire();
}
 
class Motorcycle {
    Body body = new Body();
    Engine engine = new Engine();
    Tire tire = new Tire();
}



하지만 아래와 같이 생성자에 객체를 받게 되면 변경된 객체만 새로 생성해서 똑같이 주입하면 되므로 변경해야 할 곳을 한 군대로 집중됨을 알 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Car {
    Body body;
    Engine engine;
    Tire tire;
    
    public Car(Body body, Engine engine, Tire tire) {
        this.body = body;
        this.engine = engine;
        this.tire = tire;
    }
}
 
class motorcycle {
    Body body;
    Engine engine;
    Tire tire;
 
    public motorcycle(Body body, Engine engine, Tire tire) {
        this.body = body;
        this.engine = engine;
        this.tire = tire;
    }
}