먼저 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. 이 컴포넌트를 만들고, 사용하는 부분
'개발 > 자세히 쳐다 보면...' 카테고리의 다른 글
토이프로젝트 1-8 view binding (0) | 2023.04.12 |
---|---|
토이프로젝트 1-7 dagger 써보기 -2- (0) | 2023.04.11 |
토이프로젝트 1-5 room 써보기 (0) | 2023.03.12 |
토이프로젝트 1-4 모듈 만들기 (0) | 2023.03.09 |
토이프로젝트 1-3 기본 Activity 만들기 테스트용. Virtual Device 생성 (0) | 2023.02.18 |
댓글