brunch

You can make anything
by writing

C.S.Lewis

by 이승현 May 08. 2017

Dagger 2 #01

Dependency injection on Android

Dependency injection on Android


Dagger 2를 이용하기 전에, 의존성 주입(Dependency Injection)의 개념을 명확히 할 필요가 있습니다.

Dagger 2 - A fast dependency injector for Android and Java


#01 Dependency Injection on Google


구글링을 해보니 많이 나오긴 하는데 이해하기 어렵거나 명확하지 않은 게 많았습니다.

간단히 개념을 이해하기 위해 "James Shore -Dependency Injection Demystified" 참조했습니다.




Dependency Non-Injection


#02 Dependency Non-Injection


Example 클래스를 보면 "myDatabase"라 이름이 지어진 "변수(variable)"가 있습니다.

private DatabaseThingie myDatabase;


생성자에서 초기화되어 "인스턴스 변수(instance variable)"가 됩니다.

myDatabase = new DatabaseThingie();


그리고 인스턴스 변수를 통해 메서드(method)를 호출합니다.

myDatabase.GetData();


이 모든 것을 "의존성(dependency)"이라 부를 수 있습니다.




Dependency Injection


#03 Dependency Injection


변수를 생성자에 전달할 수 있습니다.

이를 통해 클래스에 "의존성(dependency)"을 "주입(inject)"합니다.

이제 변수(의존성)를 이용할 때 직접 만든 객체 대신에 전달받은 객체를 이용합니다.

public Example(DatabaseThingie useThisDatabaseInstead) {
        myDatabase = useThisDatabaseInstead;
}


이게 전부입니다.

나머지는 이 기본 패턴의 변형들입니다.


생성자 주입 : 필요한 의존성을 모두 포함하는 클래스의 생성자를 만들고 그 생성자를 통해 의존성을 주입.

세터(Setter)를 통한 주입 : 의존성을 입력받는 세터(Setter) 메서드를 만들고 이를 통해 의존성을 주입.

인터페이스(Interface)를 통한 주입 : 의존성을 주입하는 함수를 포함한 인터페이스를 작성하고 이 인터페이스를 구현하도록 함으로써 실행 시에 이를 통하여 의존성을 주입.


의존성 주입은 인스턴스 변수를 전달하는 것입니다.




Why Do We Do This?



아래와 같이 여러 이점이 있습니다.

무엇보다도 테스트 중에 클래스를 분리하는 것이 편리합니다.


의존 관계 설정이 컴파일 시가 아닌 실행 시에 이루어져 모듈들 간의 결합도 를 낮출 수 있다.

코드 재사용을 높여서 작성된 모듈을 여러 곳에서 소스코드의 수정 없이 사용할 수 있다.

모의 객체 등을 이용한 단위 테스트의 편의성을 높여준다.





의존성 주입이라는 용어를 처음 접했을 때는 생소했는데, 알고 보니 쉬운 개념이네요.

Dagger 2도 이용하기 쉬워야 할 텐데....


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari