안드로이드 9주차 정리(Repository Pattern, WorkManager)

Repository Pattern

우리가 안드로이드 개발을 하다보면 데이터를 로컬 DB에서 가져오기도 하고, 네트워크에서 받아오기도 한다. 이런 상황에서 데이터는 여러가지 형태를 갖게 된다. Repository는 데이터와 비즈니스 로직 사이에 존재하며 이렇게 분리된 데이터 형태를 하나의 데이터 형식으로 통합하여 제공하는 인터페이스의 역할을 한다.

장점

(1) 데이터 로직과 비즈니스 로직을 분리할 수 있다

(2) Domain에서는 일관된 인터페이스를 통해 데이터를 요청할 수 있다.

(3) 데이터 저장소의 데이터를 캡슐화할 수 있다. 객체지향적인 프로그래밍에 더 적합하다.

(4) 단위 테스트를 통한 검증이 가능하다.

(5) 객체 간의 결합도가 감소한다.

(6) 어플리케이션의 전체적인 디자인이 바뀌더라도 적용할 수 있는 유연한 아키텍쳐이다.

WorkManager

WorkManager는 지속적인 작업에 권장되는 솔루션입니다. WorkManager는 지연 가능하고 실행 보장이 필요한 백그라운드 작업을 위한 것입니다.

  • 지연 가능은 작업을 즉시 실행할 필요가 없음을 의미합니다. 예를 들어, 분석 데이터를 서버로 보내거나 백그라운드에서 데이터베이스를 동기화하는 것은 지연될 수 있는 작업입니다.

  • 실행 보장은 앱이 종료되거나 기기가 다시 시작되더라도 작업이 실행됨을 의미합니다.

작업의 유형

WorkManager가 처리하는 지속적인 작업의 유형은 세 가지입니다.

  • Immediate: 즉시 시작하고 곧 완료해야 하는 작업입니다. 신속하게 처리될 수 있습니다.

  • Long Running: 오래(10분 이상이 될 수 있음) 실행될 수 있는 작업입니다.

  • Deferrable: 나중에 시작하며 주기적으로 실행될 수 있는 예약된 작업입니다.

유형주기성액세스 방법
Immediate1회OneTimeWorkRequest 및 Worker 신속 처리 작업의 경우 OneTimeWorkRequest에서 setExpedited()를 호출합니다.
Long Running1회 또는 주기적모든 WorkRequest 또는 Worker. Worker에서 setForeground()를 호출하여 알림을 처리합니다.
Deferrable1회 또는 주기적PeriodicWorkRequest 및 Worker

WorkManager 라이브러리를 구성하는 클래스

  • Worker: 이 클래스는 백그라운드에서 실행할 실제 작업(작업)을 정의하는 곳입니다. 이 클래스를 확장하고 doWork() 메서드를 재정의합니다. doWork() 메서드는 데이터를 서버와 동기화하거나 이미지를 처리하는 등 백그라운드에서 수행할 코드를 넣는 곳입니다.

  • WorkRequest: 이 클래스는 백그라운드에서 작업자를 실행하라는 요청을 나타냅니다. WorkRequest를 사용하여 장치 연결 또는 Wi-Fi 연결과 같은 제약 조건의 도움으로 작업자 작업을 실행하는 방법과 시기를 구성합니다.

  • WorkManager: 이 클래스는 WorkRequest를 예약하고 실행합니다. WorkManager는 지정한 제약 조건을 준수하면서 시스템 리소스의 부하를 분산시키는 방식으로 작업 요청을 예약합니다.

WorkManager를 간단하게 사용해본 예제

Worker 클래스

class RefreshDataWorker(appContext: Context, params: WorkerParameters): CoroutineWorker(appContext, params) {
    companion object {
        const val WORK_NAME = "com.example.android.devbyteviewer.work.RefreshDataWorker"
    }

    override suspend fun doWork(): Result {
        val database = getDatabase(applicationContext)
        val repository = VideosRepository(database)
        try {
            repository.refreshVideos()
        } catch (err: HttpException) {
            return Result.retry()
        }
        return Result.success()
    }
}

WorkRequest와 WorkManager

/**
 * Override application to setup background work via WorkManager
 */
class DevByteApplication : Application() {
    private val applicationScope = CoroutineScope(Dispatchers.Default)

    private fun delayedInit() {
        applicationScope.launch {
            Timber.plant(Timber.DebugTree())
            setupRecurringWork()
        }
    }
    /**
     * onCreate is called before the first screen is shown to the user.
     *
     * Use it to setup any background tasks, running expensive setup operations in a background
     * thread to avoid delaying app start.
     */
    override fun onCreate() {
        super.onCreate()
        delayedInit()
    }

    /**
     * Setup WorkManager background job to 'fetch' new network data daily.
     */
    private fun setupRecurringWork() {
        val constraint = Constraints.Builder()
            .setRequiredNetworkType(NetworkType.UNMETERED)
            .setRequiresBatteryNotLow(true)
            .setRequiresCharging(true)
            .apply {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    setRequiresDeviceIdle(true)
                }
            }
            .build()

        val repeatingRequest = PeriodicWorkRequestBuilder<RefreshDataWorker>(1, TimeUnit.DAYS)
            .setConstraints(constraint)
            .build()

        WorkManager.getInstance().enqueueUniquePeriodicWork(
            RefreshDataWorker.WORK_NAME,
            ExistingPeriodicWorkPolicy.KEEP,
            repeatingRequest)
    }
}

출처

HERSTORY
안드로이드 기초 코드랩
안드로이드 공식 문서

좋은 웹페이지 즐겨찾기