[Android] Dependency Injection(DI)

Arkiee·2022년 11월 13일
0

Android

목록 보기
3/3
post-thumbnail

Dependency Injection: DI

의존성 주입이란 외부에서 의존 객체를 생성해 넘겨주는 것을 의미합니다. 일반적인 객체 생성과 DI를 적용한 객체 생성을 비교하면, 일반적인 객체 생성은 클래스 안에서 사용할 객체를 생성하지만, DI를 적용한 객체 생성은 외부에서 생선된 객체를 주입받는 방식입니다.

※ 의존성
의존성이란 A라는 객체(클래스)가 B라는 객체(클래스)를 사용한다는 의미로 아래 예제를 이용해 간단하게 이해해봅시다.

class SomeDataRepository{
	private val source: SomeDataSource = SomeDataSource()
}
class SomeDataSource{
}

SomeDataRepository 내부에 SomeDataSource 객체를 생성해 갖고 있으므로 SomeDataRepository 객체는 SomeDataSource 객체에 의존성을 가지고 있다고 말할 수 있습니다.

의존성이 생길 경우, 코드의 재활용성이 떨어지고, SomeDataSource가 수정될 경우, SomeDataRepository 클래스도 함께 수정되어야하므로, 결합도(coupling)이 높아집니다.(유지보수에 불리해 보이네요.)

위의 예시를 '의존성 주입' 코드로 변경해봅시다.

class SomeDataRepository(private val source: SomeDataSource){

}
class SomeDataSource{

}

변경된 부분은 클래스 내부에서 생성하던 SomeDataSource 객체의 위치를 생성자로 이동시켰습니다. 이 경우에, SomeDataRepository를 생성하기 위해선 외부에서 생성자에 SomeDataSource를 생성해서 넣어줘야 합니다.

val someDataSource = SomeDataSource()
val someDataRepository = SomeDataRepository(someDataSource)

위와 같이 말이죠. 이와 같은 것을 "의존성 주입"이라고 합니다.


왜 DI?

왜 귀찮게 매번 생성할 때마다 생성자에 넣는 귀찮은 짓을 해야할까요? 먼저 왜 필요하지를 보고 예제를 살펴봅시다.

1. 코드의 가독성 증가

2. Unit Test가 용이

3. 코드의 재활용성을 높임

4. 객체 간의 의존성(종속성)을 직접 설정해 줄이거나 없앨 수 있음

5. 객체 간의 결합도를 낮추면서 유연하게 만듬

예제.

class SomeDataRepository(private val source: SomeDataSource) {
    fun loadData(): SomeData? = source.loadData()

    fun saveData() { source.saveData(null) }
}

data class SomeData(
    val data: String
)

interface SomeDataSource {
    fun loadData(): SomeData?
    fun saveData(data: SomeData?)
}

class SomeRemoteDataSourceImpl: SomeDataSource {
    override fun loadData(): SomeData? = null

    override fun saveData(data: SomeData?) {}
}

class SomeLocalDataSourceImpl: SomeDataSource {
    override fun loadData(): SomeData? = null

    override fun saveData(data: SomeData?) {}
}

위 코드를 보면 데이터를 획득하는 행위를 인터페이스로 추상화하고 Remote인지 Local인지에 따라 구현을 다르게 하고, 인터페이스 구현체를 생성자에 넣습니다. 즉, 상황에 따라 다른 구현체를 주입해서 코드를 수정할 필요도 없고 SomeDataRepository도 영향을 받지 않습니다.


안드로이드의 DI

안드로이드에서 DI를 하기 위해서는 보통 라이브러리를 사용하며 프레임워크로는 Dagger, Koin, Hilt가 유명합니다. 그 중 구글이 미는 Hilt를 현재 진행중인 개인 프로젝트에 적용해 볼 예정이고 적용이 완료되면 한번 내용을 추가해보도록 하겠습니다!


[참고]
https://yejinson97gaegul.tistory.com/entry/Android-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85-DI-%EB%9E%80
https://doitddo.tistory.com/94

profile
꿈을 꾸는 개발자

0개의 댓글