Android (안드로이드)

[Android] Dagger / 대거 / 예제 / 의존성 주입 라이브러리

Oscar:) 2024. 2. 24. 06:13

 

 

지난 포스팅에서 의존성 주입에 대해 알아보았다.

 

이번에는 의존성 주입을 도와주는 라이브러리 중 하나인

Dagger에 대해 알아보자.

 

 

 


 

Dagger 란?

 

 

Google에서 유지 · 관리하는 의존성 주입 라이브러리다.

 

Annotation Processing을 적용하는 정적 솔루션이다.

 

*Annotation Processing
런타임 시점이 아닌 컴파일 시점에서 어노테이션을 읽고
관련 소스 코드를 생성할 수 있다.

런타임 시점에서 해왔던 작업을 컴파일 시점에서 미리 처리하기에,
런타임의 부담을 덜어줄 수 있다.

 

 

 

Dagger는 다음과 같이 3가지로 구성하여 사용한다.

 

 

● Module

주입할 의존성을 세팅하는 곳이다.

 

● Component

Module을 연결하고, 주입할 위치를 지정하는 곳이다.

(위치라는 건, Activity나 Fragment가 될 것이다)

 

● Inject

주입할 대상을 지정한다.

 

 

 

위처럼 3가지의 관심사 분리로 인해,

프로젝트 확장 시에도 복잡도를 제한할 수 있다.

 

 

 


 

사용해보자

 

 

✅ 의존성 추가

 

build.gradle(모듈 수준)에 다음 의존성을 추가해준다.

dependencies {
    implementation 'com.google.dagger:dagger:2.50'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.50'
}

 

 

코틀린의 경우 다음과 같이 추가한다.

plugins {
    id("kotlin-kapt")
}

dependencies {
    implementation("com.google.dagger:dagger:2.50")
    kapt("com.google.dagger:dagger-compiler:2.50")
}

 

 

 

최신 버전은 공식 깃허브에서 확인하기 바란다 ↓

 

 

Releases · google/dagger

A fast dependency injector for Android and Java. Contribute to google/dagger development by creating an account on GitHub.

github.com

 

 


 

✅ 의존성이 될 클래스 세팅

 

Car · Engine 클래스를 의존성으로 사용할 것이기에

해당 클래스를 간단히 만들어 주겠다.

 

 

Car.java & Engine.java

public class Car {

    Engine engine;

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

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

}

public class Engine {

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

}

 

앞선 DI 포스팅의 예제와 동일하다.

 

 


 

✅ Module 생성

 

Dagger의 3가지 요소 중 하나인 Module을 클래스로 만들어준다.

 

 

CarModule.java

@Module
public class CarModule {

    @Provides
    Car provideCar(Engine engine) {
        return new Car(engine);
    }

    @Provides
    Engine provideEngine() {
        return new Engine();
    }

}

 

Module 클래스에는 @Module 어노테이션을 붙여준다.

 

또한 주입할 의존성에 @Provides 어노테이션을 붙여줘야 한다.

 

 


 

✅ Component 생성

 

이제 Dagger의 또 다른 구성 요소 중 하나인 Component를 인터페이스로 만들어 주자.

 

 

CarComponent.java

@Component(modules = CarModule.class)
public interface CarComponent {

    void inject(MainActivity activity);

}

 

Component 인터페이스에는 @Component 어노테이션을 붙이고,

연결할 Module을 작성해줘야 한다.

 

그리고 의존성을 주입할 위치를 매개 변수로 삼는 메서드를 하나 만들어 준다.

 

 


 

✅ Rebuild Project

 

Module과 Component를 생성했다면 프로젝트를 빌드해준다.

 

 

프로젝트가 빌드되면 다음과 같이 Dagger + Component 클래스가 자동 생성된다.

 

 

 

 


 

✅ MainActivity에서 Inject

 

위에서 생성된 DaggerComponent 클래스를 사용하여

MainActivity에 Car 객체를 주입하는 예제다.

 

 

MainActivity.java

public class MainActivity extends AppCompatActivity {

    // 주입 받을 대상 지정
    @Inject
    Car car;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Component 초기화
        CarComponent carComponent = DaggerCarComponent.builder()
                .carModule(new CarModule())
                .build();

        // MainActivity 지정
        carComponent.inject(this);

        car.start();

    }
}

 

잘 찾아봐도, Car 객체를 선언했지만 초기화 해주는 곳이 없다.

 

Component에서 의존성을 주입 받았기에 Car 객체를 사용할 수 있는 것이다.

 

 


 

실행

 

 

Engine 클래스의 start() 메서드 로그가 잘 찍혔다.

 

 

 


 

정리

 

 

요약하자면 다음 그림과 같다.

 

 

 

Module에서 주입할 의존성을 세팅하고

Component에 Module을 연결해준다.

 

Activity에서는 Component를 초기화하고

의존성 주입 받을 객체에 Inject 하여 사용한다.

 

 

 


 

 

 

 

의존성 주입 라이브러리인 Dagger에 대해 알아보았다.

 

공식 라이브러리였지만, 이젠 안드로이드에서 그렇게 좋은 대우를 받진 못한다.

 

 

Dagger 공식 문서에서조차 Hilt 라는 다른 라이브러리를 권장하고 있다.

 

 

다음 포스팅에서는 또 다른 의존성 주입 라이브러리인

Hilt에 대해 알아보겠다.