서론
KMM을 기반으로 프로젝트를 진행하다보면 프로젝트 셋팅과 대한 중요도를 자주 느끼곤 합니다.
KMM의 샘플을 보다보면 데이터베이스로 sqldelight를 사용하는 프로젝트를 자주 볼 수 있다. 그래서 데이터베이스를 추가하면서 겪었던 이슈들을 정리하고자 한다.
디펜던시
build.gradle.kts
classpath("com.squareup.sqldelight:gradle-plugin:1.5.3")
build.gradle.kts(:shared)
plugins {
//...
id("com.squareup.sqldelight")
}
val androidMain by getting {
//...
dependencies {
//...
implementation("com.squareup.sqldelight:android-driver:1.5.3")
}
}
sqldelight {
// 앱에서 사용할 Database 클래스 이름
// 파일 이름과 매칭될 필요는 없음
database("NftDataBase") {
// packageName의 위치는 해당 플러그인을 통해서 접근할 수 있는 package 위치
packageName = "com.hbs.getmoenyfornft.sqldelight"
sourceFolders = listOf("kotlin")
}
}
패키지 위치
NftDataBase.sq 파일의 패키지가 commonMain 이하의 com.hbs.getmoenyfornft.sqldelight 이여서 해당 패키지를 위치로 해줍니다. 그렇기 때문에 sqldelgight 이하에 com.hbs.getmoenyfornft.sqldelight 으로 패키지를 등록해줘야 합니다.
NftDatabase 생성
actual class SqlDriverProvider(private val context: Context) {
actual fun createDriver(): SqlDriver {
return AndroidSqliteDriver(NftDataBase.Schema, context, "test.db")
}
}
class NftDatabaseProvider(private val sqlDriverProvider: SqlDriverProvider) {
fun provideNftDatabase(): NftDataBase {
return NftDataBase(sqlDriverProvider.createDriver())
}
}
각 OS 별로 driver를 만들어준 후에 Database를 제공하기 위한 로직을 추가해줍니다.
-> 현재 프로젝트는 안드로이드 위주로 프로젝트를 진행하다보니, iOS 로직이 정상적으로 분기될 지에 대해서는 추가적인 작업이 필요
Repository를 통한 데이터 쿼리
class LocalNftRepository(nftDatabaseProvider: NftDatabaseProvider) : ILocalNFTRepository {
private val database = nftDatabaseProvider.provideNftDatabase()
override fun selectAll(): Query<NftTransaction> {
return database.nftDataBaseQueries.selectAll()
}
override fun insert(transaction: NftTransaction) {
database.nftDataBaseQueries.insert(transaction)
}
}
제공받은 NftDatabaseProvider를 통해서 query를 각 OS별로 사용할 수 있도록 해줍니다.
'Android 공부 > KMM' 카테고리의 다른 글
코틀린 밖에 못하는 바보 ... - Compose multiplatform & Kotlin multiplatform 경험기 (1) (4) | 2024.09.08 |
---|---|
KMP에서 Unresolved reference: IO 에러 땜질하는 법 (0) | 2024.02.05 |
2024년의 NEW 감자튀김의 프로젝트 (0) | 2024.01.31 |
KMM (1) 시작 (1) | 2022.04.16 |