본문 바로가기

IT/오브젝트

DI(Dependency Injection) 와 IOC(inversion of control)

 

안녕하세요 남갯입니다

 

github.com/namget/object_study 오브젝트 5장

 

일단 오브젝트 스터디하는 내용의 과제로 오늘은 DI와 IOC를 알아보고 정리하는 시간을 가져보려고 합니다.

 

 

DI 의존성 주입

 

의존성 주입이란?

소프트웨어 엔지니어링에서 의존성 주입(dependency injection)은 하나의 객체가 다른 객체의 의존성을 제공하는 테크닉이다.

[위키 백과] 의존성 주입 ko.wikipedia.org/wiki/%EC%9D%98%EC%A1%B4%EC%84%B1_%EC%A3%BC%EC%9E%85

 

의존성 주입 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 소프트웨어 엔지니어링에서 의존성 주입(dependency injection)은 하나의 객체가 다른 객체의 의존성을 제공하는 테크닉이다. "의존성"은 예를 들어 서비스로 사용할

ko.wikipedia.org

 

간단하게 객체가 다른 객체의 의존성을 제공하는 테크닉이라고 합니다.

 

우리가 의존성주입이라는 단어는 많이 들어봤는데 일단 의존성이 무엇인지 부터 알아보고 갑시다

 

 

의존성이란?

객체지향에서의 의존성이란 두 클래스 간의 관계로 설명할수 있습니다.

 

예를 들면

 

두개의 클래스가 있다고 가정해봅시다.

 

Bag 클래스가 있고

 

public class Bag {
    Bag(){
        
    }
}

People 클래스가 있습니다.

public class People {
    private Bag bag = new Bag();
}

 

사람들 클래스내에서 bag에 대한 생성을 하고 있습니다.

 

그러가다 가방에 새로운 생성자가 생겼고 그걸 변경해야한다고 합니다.

 

public class Bag {
    int money = 0;
    Phone phone;

    Bag(int moneny , Phone phone){
        this.money = money;
        this.phone = phone;
    }
}

 

가방의 클래스는 위와같이 다른 동작을 하는 기능들이 추가되었고 변경이 필요합니다.

 

하지만 People은 Bag의 동작이 변경되었다는 이유만으로

 

public class People {

    private Bag bag = new Bag(5, new Phone());
}

 

People의 동작이 변경되었습니다.  People의 동작은 변경되지 않았음에도 변경이 필요했습니다

 

이렇게 People은 Bag의 동작이 변경됨에 따라 같이 변경이 되어야하는것을

People 은 Bag에게 의존성 혹은 의존관계에 있다라고 표현합니다

 

 

 

의존성 주입은?

마틴 파울러의 의하면 IOC 제어의 역전의 방법으로 의존성 주입과 서비스로케이터 두개가 있다고 말하죠

두 경우의 공통점은 어플리케이션의 구체적인 구현과는 독립적이지만 해당 구현이 애플리케이션 클래스에 제공되는 방식에 있습니다. 서비스 로케이터를 사용하면 애플리케이션 클래스는 로케이터에 대한 메시지를 통해 명시 적으로 요청합니다. 주입을 사용하면 명시적인 요청이 없으며 서비스가 애플리케이션 클래스에 표시되므로 제어가 반전됩니다.

 

 

 

의존성 주입의 의도는 객체의 생성과 사용의 관심을 분리하는 것이다. 이는 가독성과 코드 재사용을 높혀준다. 즉 생성의 책임을 만드는게 아니라 생성한 객체를 주입시켜서 사용의 관심과 생성의 관심을 분리하는것입니다.

 

의존성주입을 하기위해서는 세가지의 스타일이 있는데

 

인터페이스 주입, 생성자 주입, 세터주입 세가지가 있습니다.

 

 

생성자 주입

class MovieLister... public MovieLister(MovieFinder finder) { this.finder = finder; }

class MovieLister... public MovieLister(MovieFinder finder) { this.finder = finder; }

 

 

세터 주입

public void setFinder(MovieFinder finder) { this.finder = finder; }

public void setFinder(MovieFinder finder) { this.finder = finder; }

 

인터페이스 주입

class MovieLister implements InjectFinder public void injectFinder(MovieFinder finder) { this.finder = finder; }

 

public interface InjectFinder { void injectFinder(MovieFinder finder); }

class MovieLister implements InjectFinder public void injectFinder(MovieFinder finder) { this.finder = finder; }public interface InjectFinder { void injectFinder(MovieFinder finder); }

 

 

제어의 역전이란?

하나의 컨테이너를 통해 객체 관리를 해주는 것을 말합니다.

 

제어의 원칙이란 principle 과 같은 내용이고 나머지 di와 service locator , 디자인 패턴 등은 ioc의 원칙에 맞춘

패턴이라고 할 수 있습니다.

 

 

 

 

 

 

 

마틴 파울러에 대한 주입 관련 

www.martinfowler.com/articles/injection.html