-
Notifications
You must be signed in to change notification settings - Fork 0
[3주차:김정호]_Firebase 이미지 삭제와 저장 로직에서 예외 처리 및 병렬 처리 개선
kim4152 edited this page Jan 23, 2025
·
1 revision
- 코루틴 실행 예외처리를 try-catch로 잡고 있었다.
- 예외 전파와 처리가 제대로 이루어지고 있지 않았다
// AlbumRepository
override suspend fun deleteImageFile(...) =
supervisorScope {
val exceptionHandler = CoroutineExceptionHandler { _, _ ->
Log.e("AlbumRepository", "deleteImageFile Error")
}
FirebaseLock.deleteMutex.withLock {
return@supervisorScope when (isFileExist()) {
true -> {
val deleteFileJob = async(exceptionHandler) { ... } ... }
val checkAlbumsJob = async(exceptionHandler) { ... }
val deletePhotoJob = async(exceptionHandler) { ... }
awaitAll(deleteFileJob, checkAlbumsJob, deletePhotoJob)
true
}
false -> false
}
}
}
위 함수는 파이어베이스에서 이미지 삭제하는 기능을 한다.
이 전에는 try-catch
로만 예외처리가 되어있었지만, 이는 코루틴 빌더 함수 안에서 발생하는 예외는 처리하지 못한다는 것을 학습했다. → (launch는 코루틴을 생성하는 데 사용되는 함수일 뿐, 람다식의 실행은 CoroutineDispatcher에 의해 스레드로 분배되는 시점에 일어나기 때문)
예외 처리 방식을 supervisorScope
함수와 CoroutineExceptionHandler
로 변경했다.
supervisorScope
함수는 부모 코루틴 함수로 예외 전파를 막고 CoroutineExceptionHandler
로 하위 async
함수에 대해 예외 처리를 해주었다.
- 코드 효율성
순차적으로 실행되지 않아도 되는albumRepository.saveImageFile
과 albumRepository.getLabelsToList
가 순차적으로 실행되고 있었다.
- 예외 처리 부족
코루틴 동작 중 발생할 수 있는 예외 처리가 부족했다
- Service 종료 처리 미흡
예외 발생시 stopService(intent)
를 호출해야 하지만, 제대로 처리되지 않았다.
- 병렬 처리 도입
async
를 사용하여 saveImageFile
과 getLabelsToList
작업을 병렬로 처리
- 예외 처리
코루틴 실행 중 발생할 수 있는 예외는 CoroutineExceptionHandler
로, async
의 await
에서 발생할 수 있는 예외는 runcatching
으로 잡았고, 예외 발생 시 stopService
호출을 추가했다.