[Dagger2/Kotlin] 안드로이드 Dagger2 무작정 써보기

Android · 2020. 7. 10. 23:10

Dagger

 

우선 이 포스트는 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 어노테이션을 사용하여, 아까 모듈에서 정의했던 모델의 별칭을 사용할 수 있습니다.

 

이 어노테이션으로 별칭을 지정해 주면, 이 별칭에 맞는 모델을 가져옵니다.

 

DaggerFileComponentRebuild Project를 해주면, 자동으로 생성됩니다.

 

이 컴포너트의 이름 규칙은 Dagger[만든 컴포너트 이름] 으로 결정됩니다.

 

DaggerFileComponent.builder().build().inject(this)를 해 주면 @Inject 어노테이션을 가진 곳으로 의존성 주입이 진행됩니다.

 

해당 소스의 결과는 다음과 같습니다.

해당 포스트에 쓰인 예제는 깃허브에 올려두었습니다.

 

다음 포스팅엔 엄청난 Hilt를 사용해 봅시다!

'Android' 카테고리의 다른 글

[Hilt/Kotlin] 안드로이드 Hilt 무작정 써보기  (0) 2020.07.10
안드로이드 Context의 종류  (0) 2020.06.25