티스토리 뷰

반응형

의존성이란?

 

한 객체가 다른 객체와 상호참조하고 있다면, 현재 객체는 다른 객체에 의존성을 가진다.

 

의존성 주입이란?

DI 를 간단히 말해 외부에서 의존 객체를 생성하여 넘겨주는 것을 의미합니다.따라서 의존 관계가 내부가 아닌 외부의 설정 파일에 의해서 결정되게 됩니다.

소프트웨어 프로그래밍의 관점에서 Dependency Injection 즉 의존성 주입을 간단히 설명한다면 하나의 객체(C)가 다른 객체(B)를 필요로하는 특정 객체(A)에게 의존성을 대신 간접적으로 전달해주는 역할이라고 말할 수 있습니다. 아래의 예시를 보겠습니다.

 

A라는 특정 객체가 B라는 다른 객체를 참조하고 싶다면 이전 같은 경우에는 A가 B를 직접적으로 참조하였습니다. 그러나 의존성 주입을 활용한다면 C라는 하나의 객체가 A라는 특정 객체를 대신해 의존성을 간접적으로 전달해주고 있는 모습을 볼 수 있습니다.

 

이와 같이 A라는 각 클라이언트들이 필요로하는 객체를 직접적으로 접근하지 않아도 C라는 서비스가 관련 일들을 모두 통틀어서 클라이언트에게 주입해주기 때문에 이들은 객체간의 결합도를 줄이며 유연성과 확장성이 높은 관계를 맺을 수 있게되는 것입니다.

 

출처: https://juyeop.tistory.com/26 [글 쓰는 개발자의 꿈]

 

의존성 주입을 사용하지 않은 상태

public static void main(String[] args) {
    Heater heater = new A_Heater();
    Pump pump = new A_Pump(heater);
    CoffeeMaker coffeeMaker = new CoffeeMaker(heater,pump);
    coffeeMaker.brew();
}

커피를 내리기 위해서는 CoffeeMaker 객체 사용자가 A_Heater 라는 인터페이스 구현체와 A_Pump 라는 구현체를 알아야 커피를 내릴수 있습니다. 커피를 마시는 사람은 어떤 heater 와 pump 를 쓰는지 알고 싶어 하지 않습니다.

 

의존성 주입을 사용한 상태

public class Injection {
    public static Heater provideHeater(){
        return new A_Heater();
    }

    public static Pump providePump(){
        return new A_Pump(provideHeater());
    }

    public static CoffeeMaker provideCoffeeMaker(){
        return new CoffeeMaker(provideHeater(),providePump());
    }
    
}

public static void main(){

    CoffeeMaker coffeeMaker = new CoffeeMaker(Injection.provideHeater(),Injection.providePump());
    coffeeMaker.brew();

    Injection.provideCoffeeMaker().brew(); // 간소화
}

Injection 클래스에서 heater와 pump 를 제공받습니다. Injection을 통해 CoffeeMaker 사용자는 A_Heater를 사용해야하는지 B_Heater를 사용해야하는지 알 필요가 없습니다. 단지 Heater와 Pump 의 종류만 알고 쓰게 됩니다.

출처: https://faith-developer.tistory.com/147 [개발 이야기]

 

장점

1. 코드의 재사용성 증가

2. 리팩토링 용이

3. 보일러코드 감소

4. 테스트 용이

 

단점

1. 의존성 주입을 위한 선행작업이 필요함.

2. 코드를 추적하고 읽기가 어려워짐.

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday