IoC와 DI란 무엇일까?

2020. 5. 6. 19:00Study

IoC (Inversion of Control)

 

IoC는 제어의역전이란 뜻을 가집니다.

쉽게 말해 제어가 반대로 간다는 개념입니다.

IoC는 객체 생명 관리, 흐름 제어를 제 3자에게 위임하는 프로그래밍 모델입니다.

아래는 IoC 프로그래밍 패턴으로 AnimalFactory 추상 클래스에게 권한을 위임한 예제입니다.

ex)

public abstract class AnimalFactory {
    private Animal animal;

    public Animal getAnimal () { return make(); }
    private Animal make() { return animal; }

    protected abstract void tiger();
    protected abstract void horse();
}

 

public class Zoo extends AnimalFactory {
    @Override public void tiger() { }
    @Override public void horse() { }
}

여기서 ZOO Class는 상위 클래스가 어떻게 구현되어있는지 전혀 알 수 없고

권한이 없기때문에 구현만 가능합니다.

 

DI (Dependency Injection)

 

DI는 의존성 주입이란 뜻을 가집니다.

쉽게 말해 외부에서 의존 객체를 생성하여 전달하는 것을 말합니다.

 

DI는 IoC 프로그래밍 모델을 구현하는 방식중에 하나이며,

DI를 도와주는 프레임워크 중 google에서 지원하는 Dagger가 있습니다.

외부에서 객체를 생성하고 넘겨주는 것을 스프링에서는 컨테이너,

Dagger에서는 Component와 Module이라고 부릅니다.

 

DI 의존성 주입은 3가지 조건이 있습니다.

 

- 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. 그러기 위해서는 인터페이스에만 의존하고 있어야 한다.

- 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정한다.

- 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공(주입)해줌으로써 만들어진다.

 

DI의 핵심 개념 : DI는 클래스타입이 고정되어 있지 않고 인터페이스 타입의 파라미터를 통해

다이나믹하게 구현 클래스를 결정해서 제공 받을수 있어야 한다.

 

아래는 위에서 말한 조건 3가지와 핵심 개념을 통해 구현한 예제입니다.

ex)

public class ZooController {
    private ZooService zooService;

    public ZooController(ZooService zooService) {
        this.zooService = zooService;
    }
}

 

public interface ZooService {
    void feeding();
    void Riding();
}

 

public class Tiger implements ZooService {

    @Override public void feeding() { System.out.println("호랑이 먹이 주기"); }

}

 

public class Horse implements ZooService {

    @Override public void Riding() { System.out.println("말 타기"); }

}

 

결론

 

IoC는 객체의 흐름, 생명주기관리등 독립적인 제 3자에게 역활과 책임을 위임하는 방식에 프로그래밍 모델이며 범용적인 표현이다.

DI는 인터페이스를 통해 다이나믹하게 객체를 주입을 하여 유연한 프로그래밍을 가능하게 하는 패턴이다.

 

참고 사이트 링크

https://biggwang.github.io/2019/08/31/Spring/IoC,%20DI%EB%9E%80%20%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C/#undefined

'Study' 카테고리의 다른 글

JVM(Java Virtual Machine)이란 무엇일까?  (0) 2020.08.03
Boiler plate란 무엇일까?  (0) 2020.05.07
POJO Class란 무엇일까?  (0) 2020.03.09
synchronized란 무엇일까?  (0) 2020.02.14
LinkedList 와 ArrayList의 특징  (0) 2020.01.13