우선 이 포스트는 Dagger2 무작정 써보기이기 때문에 Dagger에 대한 기초 지식을 알고 있다는 가정 하에 시작합니다.
이 예제는 간단하게 파일 목록 조회와, 해당 파일명의 랜덤 아이디를 부여하는걸로 작성되었습니다.
제일 먼저 Dagger2(이하 대거)를 쓰기 위해선 gradle 설정이 필요합니다.
apply plugin: 'kotlin-kapt'
...
dependencies {
...
implementation 'com.google.dagger:dagger:2.28'
kapt 'com.google.dagger:dagger-compiler:2.28'
...
}
일단 이렇게 대거를 쓰기 위한 gradle 설정은 끝났습니다.
이제 모델을 만들어야 합니다.
data class FileDataModel (var data: String)
모델은 이렇게 data class를 이용하여 간단하게 작성할 수 있습니다.
다음은 모듈을 만들어야 합니다.
@Module
class FileModule {
@Module
companion object {
@Provides
@Named("name")
@JvmStatic
fun provideFileName(): ArrayList<FileDataModel> {
val array = ArrayList<FileDataModel>()
val files = File("/sdcard").list().map {
val file = File(it)
array.add(FileDataModel(file.name))
}
return array
}
@Provides
@Named("random")
@JvmStatic
fun provideRandom(): ArrayList<FileDataModel> {
val array = ArrayList<FileDataModel>()
val files = File("/sdcard").list().map {
val file = File(it)
array.add(FileDataModel(Random.nextInt(0, 10000).toString()))
}
return array
}
}
}
모듈은 이렇게 작성하였습니다.
@Named 어노테이션을 설정하여, 가져올 모델의 별칭을 설정합니다.
하나의 모듈 안에서 여러가지의 모델들중 선택하여 가져오려고 할 때 사용됩니다.
모듈 부분을 정적으로 한 이유는, 여기서 확인 가능합니다.
다음으로는 컴포너트 부분을 만들어야 합니다.
@Singleton
@Component(modules = [FileModule::class])
interface FileComponent {
fun inject(activity: MainActivity)
}
컴포너트 부분은 비교적 간단하게 이렇게 작성 할 수 있습니다.
@Component 어노테이션을 사용해, 모듈을 설정해 줍니다.
이제 대거를 사용하기 위한 모든 준비가 끝났습니다.
우선 Clean Project를 해 준 후, Rebuild Project를 해 줍니다.
모두 완료 됬으면, 다음과 같이 사용할 수 있습니다.
class MainActivity : AppCompatActivity() {
@Inject
@field:Named("name")
lateinit var filesData: ArrayList<FileDataModel>
@Inject
@field:Named("random")
lateinit var fileData2: ArrayList<FileDataModel>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
DaggerFileComponent.builder()
.build()
.inject(this)
for(i in 0 until filesData.size){
Log.d(filesData[i].data, "random id: ${fileData2[i].data}")
}
}
}
@field:Named 어노테이션을 사용하여, 아까 모듈에서 정의했던 모델의 별칭을 사용할 수 있습니다.
이 어노테이션으로 별칭을 지정해 주면, 이 별칭에 맞는 모델을 가져옵니다.
DaggerFileComponent는 Rebuild Project를 해주면, 자동으로 생성됩니다.
이 컴포너트의 이름 규칙은 Dagger[만든 컴포너트 이름] 으로 결정됩니다.
DaggerFileComponent.builder().build().inject(this)를 해 주면 @Inject 어노테이션을 가진 곳으로 의존성 주입이 진행됩니다.
해당 소스의 결과는 다음과 같습니다.
해당 포스트에 쓰인 예제는 깃허브에 올려두었습니다.
다음 포스팅엔 엄청난 Hilt를 사용해 봅시다!
'Android' 카테고리의 다른 글
[Hilt/Kotlin] 안드로이드 Hilt 무작정 써보기 (0) | 2020.07.10 |
---|---|
안드로이드 Context의 종류 (0) | 2020.06.25 |