개발/자세히 쳐다 보면...

토이프로젝트 1-6 dagger 써보기 -1-

lonewhitedot 2023. 4. 9. 15:20
반응형

 

 

 

먼저 dagger를 쓰겠다고, build gradle에 추가해야겠지?

 

app 모듈에 추가하고, 이제는 app에서 database를 빌드 해야하니깐 Room 추가하자.

 

dependencies {

    implementation 'androidx.core:core-ktx:1.7.0'
    implementation 'androidx.appcompat:appcompat:1.4.1'
    implementation 'com.google.android.material:material:1.5.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

    implementation project(':data')

    def dagger_version = "2.28.3"

    implementation "com.google.dagger:dagger:$dagger_version"
    kapt "com.google.dagger:dagger-compiler:$dagger_version"

    def room_version = "2.5.0"

    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"
    // To use Kotlin annotation processing tool (kapt)
    kapt "androidx.room:room-compiler:$room_version"
}

 

원래는 app 모듈에서는 room을 아예 안쓰게 할려고 했지만, 그러면 전체를 아우르는 모듈을 또 추가해야하고 그래서 그거는 일단 나중에 하는거로.

 

참고로 앱 모듈에는 우리가 kapt 쓴다고 한 적이 없으니.. 플러그인도 꼭 추가해야해

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'kotlin-kapt'
}

 

Dagger는 일단 크게 세 부분으로 나눠져 있다고 생각하면 쉬워.

코딩하는 순서대로 생각해보면,

1. 어떤식으로 객체를 만들지 정의하는 Mudule

2. 1의 Module을 이용해서 여기에 넣어줘 라고 쓰는 Component

3. 이 컴포넌트를 만들고, 사용하는 부분

 

패키지 구조는 아래처럼.

 

1. 어떤식으로 객체를 만들지 정의하는 Mudule

코드를 보면, 

package com.lonewhite.finhelper.di.module

import android.content.Context
import androidx.room.Room
import com.lonewhite.finhelper.data.db.AppDatabase
import com.lonewhite.finhelper.data.db.DATABASE_NAME
import com.lonewhite.finhelper.data.db.dao.InvItemDao
import com.lonewhite.finhelper.data.repository.Repository
import dagger.Module
import dagger.Provides

@Module
class DataModule (private val context: Context){

    @Provides
    fun provideContext(): Context {
        return context
    }


    @Provides
    fun provideRepository(dao: InvItemDao): Repository {
        return Repository(dao)
    }

    @Provides
    fun provideAppDatabase(context: Context): AppDatabase {
        return Room.databaseBuilder(context.applicationContext,
            AppDatabase::class.java, DATABASE_NAME
        ).allowMainThreadQueries().build()
    }

    @Provides
    fun provideInvItemDao(db: AppDatabase): InvItemDao {
        return db.invItemDao()
    }
}

@Module로 내가 모듈이오 라고 말해주고,

@Provides로 각 객체는 이렇게 만들어 주고 하는거야.

 

실질적으로 우리까 쓸 repository 기준으로 볼까?

repository 는 dao가 필요하게 되어 있고, dao는 밑에 provideInvItemDao로 만드는 법이 나와있어

dao를 만들려면 db가 필요하고, db 만드는 법은 provideAppDatabase에 나와있지.

db 만들려면 context가 필요하지? 그건 또 위에 적어놔져 있지.

 

그 사이 연결은 dagger가 알아서 코드를 만들어 주는거지.

 

그 사이 연결되는 부분을 우리가 짜게되면 불편하게 뭐냐면...

예를 들어 app database를 만들때 dao가 더 필요하게 되면, 불편하게 이곳저곳 다 추가해야하는데,

그냥 새로운 dao 만드는 법과 파라미터만 추가하면 편하게 쓸수 있는거지.

 

오늘은 바뻐서... 이건 다음편에 이어서....

2. 1의 Module을 이용해서 여기에 넣어줘 라고 쓰는 Component

3. 이 컴포넌트를 만들고, 사용하는 부분

반응형