Skip to content

백그라운드 데이터베이스 업데이트

sorisdk 4.2.1부터 새로운 updateDatabase 메서드를 사용하여 백그라운드에서 오디오 인식 데이터베이스를 업데이트할 수 있습니다. 이 기능을 사용하면 인식 프로세스를 중단하지 않고도 오디오 인식 소재를 최신 상태로 유지할 수 있습니다.

개요

SORIAudioRecognizer.shared().updateDatabase(context) 메서드를 사용하면 오디오 인식이 현재 실행 중인지 여부와 관계없이 언제든지 서버에서 오디오 인식 데이터베이스를 업데이트할 수 있습니다. 이는 장시간 동안 오디오 인식을 연속적으로 실행하는 기기에서 특히 유용합니다.

예를 들어, 오디오 인식이 활성 상태인 동안 서버에 새로운 오디오 소재가 추가되었을 때, 이 메서드를 호출하면 인식 프로세스를 다시 시작하지 않고도 새로운 오디오 소재를 즉시 사용할 수 있습니다.

수동 데이터베이스 업데이트

updateDatabase 메서드를 호출하여 언제든지 수동으로 데이터베이스를 업데이트할 수 있습니다:

kotlin
val updateResult = SORIAudioRecognizer.shared().updateDatabase(this)

if (updateResult.success) {
    if (updateResult.updateAvailable) {
        Log.i("SORI", "Database updated successfully to version: ${updateResult.currentVersion}")
    } else {
        Log.d("SORI", "Database is already up to date (version: ${updateResult.currentVersion})")
    }
} else {
    Log.e("SORI", "Database update failed: ${updateResult.errorMessage}")
}

WorkManager를 사용한 주기적 백그라운드 업데이트

자동 주기적 업데이트를 위해 Android의 WorkManager를 사용하여 백그라운드 데이터베이스 업데이트를 예약할 수 있습니다. 이 방법을 사용하면 수동 개입 없이도 오디오 인식 데이터베이스를 최신 상태로 유지할 수 있습니다.

주기적 업데이트 설정

MainActivity.kt 파일에 다음 코드를 추가하여 주기적 데이터베이스 업데이트를 설정합니다:

kotlin
private fun setupPeriodicDatabaseUpdate() {
    val constraints = Constraints.Builder()
        .setRequiredNetworkType(NetworkType.CONNECTED)
        .build()

    val workRequest = PeriodicWorkRequestBuilder<UpdateDatabaseWorker>(2, TimeUnit.HOURS)
        .setConstraints(constraints)
        .build()

    WorkManager.getInstance(this).enqueueUniquePeriodicWork(
        "UpdateSORIDatabase",
        ExistingPeriodicWorkPolicy.KEEP,
        workRequest
    )

    Log.d("SORI", "Periodic database update scheduled every 2 hours")
}

배터리 최적화

워커가 너무 자주 실행되도록 설정하면 배터리 소모 등 Android 바이탈에 부정적인 영향을 미칠 수 있습니다. 최적의 기기 성능을 유지하려면 2시간 이상의 간격을 사용하는 것이 좋습니다.

워커 클래스 생성

프로젝트에 다음 구현이 포함된 새로운 UpdateDatabaseWorker.kt 파일을 생성합니다:

kotlin
package com.iplateia.soriexample

import android.content.Context
import android.util.Log
import androidx.work.CoroutineWorker
import androidx.work.WorkerParameters
import com.iplateia.sorisdk.SORIAudioRecognizer

/**
 * SORI 오디오 인식 데이터베이스를 주기적으로 업데이트하는 워커 클래스입니다.
 * 이 워커는 2시간마다 실행되어 새로운 오디오팩 업데이트를 확인하고 다운로드합니다.
 */
class UpdateDatabaseWorker(
    context: Context,
    params: WorkerParameters
) : CoroutineWorker(context, params) {

    companion object {
        private const val TAG = "UpdateDatabaseWorker"
    }

    override suspend fun doWork(): Result {
        return try {
            Log.d(TAG, "Starting periodic database update check")
            
            // SORI 인식기 인스턴스 가져오기
            val recognizer = SORIAudioRecognizer.shared()
            
            // 데이터베이스 업데이트 수행
            val updateResult = recognizer.updateDatabase(applicationContext)
            
            if (updateResult.success) {
                if (updateResult.updateAvailable) {
                    Log.i(TAG, "Database updated successfully to version: ${updateResult.currentVersion}")
                } else {
                    Log.d(TAG, "Database is already up to date (version: ${updateResult.currentVersion})")
                }
                Result.success()
            } else {
                Log.e(TAG, "Database update failed: ${updateResult.errorMessage}")
                // 일시적 실패에는 재시도, 영구적 실패에는 성공 반환
                if (updateResult.errorMessage?.contains("Authentication failed") == true) {
                    Result.failure() // 인증 실패는 재시도하지 않음
                } else {
                    Result.retry() // 네트워크 문제 등은 재시도
                }
            }
        } catch (e: Exception) {
            Log.e(TAG, "Unexpected error during database update", e)
            Result.retry()
        }
    }
}

WorkManager 종속성 추가

build.gradle 파일에 WorkManager 종속성을 추가해야 합니다:

groovy
dependencies {
    implementation "androidx.work:work-runtime-ktx:2.9.0"
}

초기화

MainActivity.onCreate() 메서드나 애플리케이션 초기화 코드에서 setupPeriodicDatabaseUpdate() 메서드를 호출합니다:

kotlin
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    
    // ... 기존 코드 ...
    
    // 주기적 데이터베이스 업데이트 설정
    setupPeriodicDatabaseUpdate()
}

모범 사례

  1. 네트워크 제약: 불필요한 데이터 사용을 방지하기 위해 연결된 상태에서만 업데이트가 발생하도록 항상 네트워크 제약을 설정합니다.

  2. 오류 처리: 일시적인 네트워크 문제(재시도)와 영구적인 실패(재시도 안 함)를 구분하기 위해 적절한 오류 처리를 구현합니다.

  3. 로깅: 업데이트 프로세스를 모니터링하고 문제를 진단하기 위해 적절한 로깅을 포함합니다.

  4. 업데이트 빈도: 업데이트 빈도를 설정할 때 사용자의 배터리 수명과 데이터 사용량을 고려합니다. 2시간 이상의 간격을 권장합니다.

  5. 사용자 경험: 데이터베이스 업데이트가 백그라운드에서 발생하므로 앱의 UX와 관련이 있는 경우 사용자에게 데이터베이스가 마지막으로 업데이트된 시간에 대한 정보를 제공하는 것을 고려합니다.

문제 해결

백그라운드 업데이트에서 문제가 발생하는 경우:

  1. 네트워크 연결 확인: 기기가 안정적인 인터넷 연결을 가지고 있는지 확인합니다.
  2. API 자격 증명 확인: API 키와 비밀이 올바르게 구성되었는지 확인합니다.
  3. 로그 검토: 문제를 식별하는 데 도움이 되는 특정 오류 메시지에 대한 로그를 확인합니다.
  4. WorkManager 제약: WorkManager 제약이 사용 사례에 적합한지 확인합니다.

API 레퍼런스

updateDatabase 메서드와 그 반환값에 대한 자세한 정보는 API 레퍼런스를 참조하세요.