파게로그

Dependency Injection, IoC Container 본문

콤퓨타 왕기초/Spring

Dependency Injection, IoC Container

파게 2021. 4. 12. 06:06

DI(Dependency Injection)

dependency(의존성, 종속성)은 '의존적인 관계'를 의미하기도 하지만, 어떤 클래스가 의존하고 있는 부품과 같은 클래스를 의미하기도 한다. 예를 들어 클래스 A 내부에서 클래스 B를 생성하여 사용할 때, B가 dependency인 것이다.

DI(Dependency Injection)는 어떤 클래스 내부에서 다른 클래스의 인스턴스를 생성하는 것이 아니라, 외부에서 생성된 인스턴스를 다른 클래스가 사용하는 것을 말한다. Spring의 경우, Spring의 컨테이너가 인스턴스를 만들어 놓으며, 다른 클래스는 만들어져 있는 인스턴스를 단순히 사용하기만 하면 된다.

 

🍓 Composition has a (일체형)

tight coupling

두 class의 life cycle은 종속적

▪ B는 A의 부품=종속성=종속 객체

class A {
    private B b;

    public A() {
        b = new B(); // 내부에서 직접 생성
    }
}

 

사용 예시

A a = new A();

 

 

🍓 Association has a (조립형, 주입형)

loose coupling

두 class의 life cycle은 독립적

외부에서 생성. 여기서 세팅하고 그 객체를 사용

느슨한 결합력. 조립은 귀찮지만 바꿔끼우기 쉬움

class A {
    private B b;

    public A() {
        /* b = new B(); */
    }

    public void setB(B b) { // setter
        this.b = b;
    }
}

 

한편 DI의 방법으로는 Setter Injection, Constructor Injection, Interface Injection이 있다(www.martinfowler.com/articles/injection.html#FormsOfDependencyInjection). 이 중 Interface Injection은 Spring에서는 지원되지 않는다.

 

사용 예시 1: Setter Injection

B b = new B(); // B is dependency
A a = new A(); // 부품을 꽂아줘야만 함(injection)
a.setB(b); // Setter Injection → 차후에 Spring의 역할

 

사용 예시 2: Constructor Injection

B b = new B(); // B is dependency
A a = newA(b); // Constructor Injection → 차후에 Spring의 역할

 

 

 

IoC Container(Inversion of Control Container)

XML file, annotation, Java Configuration를 활용해서 지시서를 작성하고, Spring은 지시된 내용대로 객체를 생성해서 이를 담을 수 있는 컨테이너에 담는다.

 

그런데 왜 이름이 Dependency Container가 아닐까?

 

🤔 composition has a 관계라면?

작은 부품부터 큰 부품으로 조립해나간다.

A 객체가 만들어지면 B 객체가 만들어지고

B 객체가 만들어지면 C 객체가 만들어지고

C 객체가 만들어지면 D 객체가 만들어지고...

 

😮 association has a 관계라면?

D → C B A 순서로 생성된다.

곧, IoC 컨테이너는 조립을 역순(Inversion of Control)으로 진행하는 컨테이너이다.

 

요컨대, 개발자가 아니라 컨테이너가 객체를 관리한다는 점는 의미에서 'IoC(제어의 역전)'이라는 이름이 붙은 것이다.

Comments