Android 공부/KMM

KMM (2) sqldelight

서론

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' 카테고리의 다른 글

KMP에서 Unresolved reference: IO 에러 땜질하는 법  (0) 2024.02.05
2024년의 NEW 감자튀김의 프로젝트  (0) 2024.01.31
KMM (1) 시작  (1) 2022.04.16