DI(Dependency Injection) 란?

Kddongkyu·2023년 12월 8일
0

CS-Study

목록 보기
5/8
post-thumbnail

💉DI (Dependency Injection) 란?

우선 DI에서 Dependency란 무엇일까?

Dependency란 의존관계를 의미한다. 의존관계에 있다는 말은 어떤 대상이 다른대상으로 부터 영향을 받는다 라고 간단하게 말할 수 있다.

따라서

의존 대상 B가 변하면, 그것이 A에 영향을 미친다.
그렇다면 A는 B에 의존성이 있다.

라고 말할 수 있는것이다.

의존성 주입을 받지않는 상황

class Car {
    private Engine engine;

    public Car() {
        engine = new Engine();  // 엔진을 직접 생성
    }
}

class Engine {
    public void start() {
        // 엔진 시작 로직
    }
    // ...
}

여기서 Car 클래스는 Engine 클래스의 인스턴스를 직접 생성합니다. 즉, Car는 Engine에 강하게 결합되어 있어, Engine 클래스가 변경되면 Car 클래스도 영향을 받습니다.

의존성 주입을 받는 상황

class Car {
    private Engine engine;

    public Car(Engine engine) {
        this.engine = engine;  // 엔진을 외부에서 주입받음
    }
}

interface Engine {
    void start();
    // 이외의 다양한 메소드
}

class GasolineEngine implements Engine {
    public void start() {
        // 가솔린 엔진 시작 로직
    }
    // ...
}

class ElectricEngine implements Engine {
    public void start() {
        // 전기 엔진 시작 로직
    }
    // ...
}

이 예시에서 Car 클래스는 Engine 인터페이스에 의존하고 있으며, 구체적인 엔진 타입(GasolineEngine 또는 ElectricEngine)은 실행 시간에 Car의 생성자를 통해 주입됩니다.
이를 통해 Car 클래스는 엔진의 구체적인 구현 세부 사항을 알 필요가 없으며, 엔진 타입을 쉽게 변경할 수 있습니다. 이 방식은 객체 간의 결합도를 낮추고 유연성을 높여줍니다.


DI (Dependency Injection)의 장점

위에서 설명한 것처럼, 의존성 주입은 객체 간의 결합도를 낮추고 유연성을 높이는 중요한 기법입니다. 이 방법의 주요 장점은 다음과 같습니다.

유연성과 확장성 향상: Car 클래스가 Engine 인터페이스에 의존함으로써, 새로운 엔진 타입을 추가하거나 기존 엔진을 변경할 때 Car 클래스를 수정할 필요가 없습니다. 이는 시스템의 확장성을 크게 향상시킵니다.

테스트 용이성: 의존성 주입을 사용하면, 테스트 중에 실제 구현 대신 모의 객체(mock object)나 스텁(stub)을 주입할 수 있어, 단위 테스트가 훨씬 쉬워집니다.

코드의 재사용성 증가: 의존성이 외부에서 주입되므로, 같은 구성 요소를 다양한 환경이나 애플리케이션에서 재사용할 수 있습니다.

코드의 명확성과 가독성 향상: 의존성이 명시적으로 드러나므로 코드의 의도가 더 명확해지고, 다른 개발자들이 코드를 이해하기 쉬워집니다.


결론

DI는 현대 소프트웨어 개발에서 중요한 원칙 중 하나입니다. 이를 통해 개발자는 더 깔끔하고 관리하기 쉬운 코드를 작성할 수 있으며, 시스템의 유지보수와 확장성을 크게 향상시킬 수 있습니다. DI의 핵심은 객체가 필요로 하는 의존성을 직접 생성하는 대신, 외부로부터 주입받는 것입니다. 이러한 접근 방식은 설계를 더 유연하게 만들고, 다양한 환경과 요구 사항에 적응할 수 있는 소프트웨어를 만드는 데 중요한 역할을 합니다.

profile
Step by step

0개의 댓글