210202

[Dagger2] DI란 무엇인가? & Dagger2 사용하기 본문

Android

[Dagger2] DI란 무엇인가? & Dagger2 사용하기

dev210202 2021. 1. 18. 11:06

developer.android.com/training/dependency-injection/dagger-basics?hl=ko

 

Dagger 기본사항  |  Android 개발자  |  Android Developers

Android 앱에서 수동 종속 항목 삽입 또는 서비스 로케이터는 프로젝트의 크기에 따라 문제가 될 수 있습니다. Dagger를 사용하여 종속 항목을 관리함으로써 프로젝트가 확장될 때 프로젝트의 복잡

developer.android.com

www.youtube.com/watch?v=ZZ_qek0hGkM&list=PLrnPJCHvNZuA2ioi4soDZKz8euUQnJW65&index=1&ab_channel=CodinginFlow

위의 링크들을 참고해서 DI를 도와주는 Dagger를 사용해보았다.

 

먼저 DI를 알아야 DI를 도와주는 Dagger에 대해서 이해도 할 수 있으니 DI에 대해서 알아보자

DI(Dependency Injection): 의존성 주입

의존성 주입이란

프로그래밍에서 구성요소간의 의존 관계가 소스코드 내부가 아닌 외부의 설정파일 등을 통해 정의되게 하는 디자인 태펀중의 하나입니다.

 

저는 보통 안드로이드를 개발할 때 객체들을 생성하고 사용하다보면 객체들간에 서로 의존하는 경우들이 많이 생깁니다. 이럴 경우 객체가 아닌 FrameWork에 의해서 객체의 의존성이 주입되는 방식을 사용하는 것이 DI입니다.

DI를 사용하면 다음과 같은 장점들이 있습니다.

1. 코드간 의존성 감소

2. 재사용 및 유지보수 용이

3. 유닛테스트시 유리

 

DI에 대해서 알아봤으니 Dagger를 적용하는 방법을 알아봅시다.

 

Dagger 적용

1. build.gradle에 Dagger 추가

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

dagger 버전은 다음 링크에서 확인해서 넣으면 됩니다.

github.com/google/dagger

 

google/dagger

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

github.com

2. @Inject를 사용하여 Dagger에 인스턴스를 만드는 방법을 알려줌

public class Notice implements Serializable {
    int id;
    String title;
    String content;
    String modifiedDate;

    @Inject
    public Notice() {

    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getModifiedDate() {
        return modifiedDate;
    }

    public void setModifiedDate(String modifiedDate) {
        this.modifiedDate = modifiedDate;
    }

    public void test(){
        Log.e("Dagger TEST","!!");
    }
}

Notice의 생성자에 @Inject 주석이 붙어있는 것을 알 수 있습니다. 만약에 생성자에 파라미터들이 있다면 해당 파라미터들에도 @Inject를 사용하여 파라미터들의 인스턴스를 만드는 방법도 알려주어야 합니다.

 

3. Component 생성

dagger에서 의존성 주입코드를 생성할 인터페이스 혹은 추상클래스인 Component를 만듭니다.

component에는 최소한 한개의 추상메소드를 가지고 있어야합니다. 그리고 추상메소드를 통해서 의존성 주입을 하게됩니다.

@Component
public interface NoticeComponent {
    Notice getNotice();
}

4. Build - Make Project

안드로이드 스튜디오 상단에 Build - Make Project를 눌러서 의존성 주입을 해주는 클래스를 dagger가 자동으로 생성하게 합니다.

 

자동생성된 모습

5. 사용할 클래스에서 의존성 주입

public class NoticeFragment extends Fragment {

    private Notice notice;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
       
        ...

        NoticeComponent component = DaggerNoticeComponent.create();
        notice = component.getNotice();

    }

}

이렇게 Component 사용해서 notice의 인스턴스를 dagger가 생성해주는 모습을 확인할 수 있습니다.

 

dagger를 사용하는 아주 기초적인 방법에 대해서만 적어놨는데 사실 이것보다 훨씬 많은 기능들이 있고 실제 사용하는 방식은 이것보다 더 어렵다.

 

초보자로써 처음 실행해본 과정을 적어보았고 다음번 포스팅에는 실제 프로젝트에서 dagger가 어떤 방식으로 사용되는지 포스팅해보겠다.

Comments