Android (안드로이드)

[Android] 의존성 주입 / Dependency Injection

Oscar:) 2024. 2. 23. 17:43

 

 

이번 포스팅에서는 의존성 주입이라는 개념을 알아보겠다.

 

 

 


 

 

의존성이란? (Dependency)

 

 

클래스에는 흔하게 다른 클래스의 참조가 필요하다.

 

예를 들어 Car라는 클래스는 Engine이라는 클래스 참조가 필요할 수 있다.

이때 필요한 클래스(Engine)가 의존성이 될 수 있다.

 

 

 


 

의존성 주입이란? (Dependency Injection)

 

 

공식 문서에서는 종속 항목 삽입이라고 표현하지만,

일반적으로는 의존성 주입이라 칭한다.

 

Dependency Injection을 줄여서 DI라고 부르기도 한다.

 

 

 

클래스가 필요한 객체를 얻는 방법은 다음과 같다.

 

1. 클래스가 필요한 객체를 자체 구성한다.
ex) Car클래스는 Engine 클래스의 인스턴스를 생성 · 초기화 한다.

2. 객체를 다른 곳으로부터 제공 받는다.
ex) 객체를 매개 변수로 제공 받는다.

3. 다른 곳에서 객체를 가져온다.
ex) getSystemService()와 같은 Android 내장 API 등

 

 

위에서 설명한 방법 중 2번 째 방법이 의존성 주입이다.

 

 

 


 

예제

 

 

위에서 예시로 언급한 Car · Engine 클래스로 예제를 만들어 보겠다.

 

 

✅ 의존성 자체 구성 예시

 

 

class Engine {

    public void start() {
        System.out.print("부릉부릉");
    }

}


class Car {

    Engine engine = new Engine();
    
    public void start() {
        engine.start();
    }

}


class MainActivity {

    Car car = new Car();
    car.start();

}

 

Car 클래스를 기준으로 보면 된다.

 

Car 클래스는 Engine 클래스를 직접적으로 참조해서 사용한다.

 

 


 

 

✅ 의존성 주입 예시

 

 

class Engine {

    public void start() {
        System.out.print("부릉부릉");
    }

}


class Car {

    Engine engine;
    
    public Car(Engine engine) {
        this.engine = engine;
    }
    
    public void start() {
        engine.start();
    }

}


class MainActivity {

    Engine engine = new Engine();
    
    Car car = new Car(engine);
    car.start();

}

 

Car 클래스의 생성자 매개 변수로 Engine 클래스를 제공 받아서 사용한다.

 

MainActivity에서 의존성(Engine)을 생성하고 주입했다.

 

 

 


 

의존성 주입 방식의 장점과 한계

 

 

✅ 장점

 

클래스가 의존성을 관리하지 않는다.

주입할 의존성을 쉽게 교체할 수 있다.

 

 

코드 재사용성 ↑

리팩토링 · 테스트 편의성 ↑

 

 


 

✅ 의존성 수동 주입의 한계

 

의존성이 많아질수록 수동으로 주입하는 작업이 번거로워진다.

Activity · Fragment 단위에서의 보일러 플레이트 코드가 많아진다.

 

 

의존성 생성 · 제공 프로세스를 자동화해주는 라이브러리의 등장

: Dagger · Hilt

 

 

 


 

 

 

 

이번 포스팅에서는 의존성 주입에 대해 알아보았다.

 

다음 포스팅에서는 의존성 주입 라이브러리에 대해 알아보자.