지금까지 DI가 뭔지 살펴봤습니다. 

그렇다면 실제 코드를 보면서 의존성 문제를 외부 주입으로 해결할 때 장점을 살펴봅시다. 

외부 주입없이 코드를 짠다고 했을 때 어떤 문제가 생길까요?

public class GasEngine {
    public void start() {
        System.out.println("Gas engine starts.");
    }
}

public class ElectricEngine {
    public void start() {
        System.out.println("Electric engine starts.");
    }
}

public class GasCar {
    private GasEngine engine;

    public GasCar() {
        this.engine = new GasEngine(); // GasEngine에 직접적으로 의존하고 있음
    }

    public void startEngine() {
        engine.start();
    }
}

public class ElectricCar {
    private ElectricEngine engine;

    public ElectricCar() {
        this.engine = new ElectricEngine(); // ElectricEngine에 직접적으로 의존하고 있음
    }

    public void startEngine() {
        engine.start();
    }
}

 

외부 주입을 하지 않고 엔진을 종류별로 만들려면 각자의 클래스가 무한대로 필요하게 될것입니다. 

하지만 외부주입을 할 수 있다면?

 

public interface Engine {
    void start();
}

public class GasEngine implements Engine {
    @Override
    public void start() {
        System.out.println("Gas engine starts.");
    }
}

public class ElectricEngine implements Engine {
    @Override
    public void start() {
        System.out.println("Electric engine starts.");
    }
}

public class Car {
    private Engine engine;

    public Car(Engine engine) { // DI를 통해 의존성 주입
        this.engine = engine;
    }

    public void startEngine() {
        engine.start();
    }
}

public class Main {
    public static void main(String[] args) {
        Engine gasEngine = new GasEngine();
        Car gasCar = new Car(gasEngine);
        gasCar.startEngine(); // "Gas engine starts."

        Engine electricEngine = new ElectricEngine();
        Car electricCar = new Car(electricEngine);
        electricCar.startEngine(); // "Electric engine starts."
    }
}

 

Car에 대한 Class를 하나로 해결할 수 있게됩니다. 

메인 메서드에서 필요한 엔진을 Car에 넣어서 만들 수 있게됩니다. 

무제한으로 늘어나야하는 클래스를 줄일 수 있는 것입니다. 

 

이렇게된다면 중복되는 코드도 줄일 수 있고

Car클래스를 재활용하기 때문에 코드의 효율도 높일 수 있습니다. 

만약 스마트팩토리 자동차 공장에서 DI없이 자동차를 만들어야하는 코드를 작성한다고 생각하면 개발자가 얼마나 하드코딩을 해야하는 것일까요? 하지만 우리는 DI를 통해 이 문제를 쉽게 해결할 수 있습니다. 

 

 

+ Recent posts