Skip to content

[3주차:김정호]_Firebase 이미지 삭제와 저장 로직에서 예외 처리 및 병렬 처리 개선

kim4152 edited this page Jan 23, 2025 · 1 revision

✅ 진행한 기능

1. 파이어베이스에서 이미지 삭제 코루틴 예외처리

문제 상황

  1. 코루틴 실행 예외처리를 try-catch로 잡고 있었다.
  2. 예외 전파와 처리가 제대로 이루어지고 있지 않았다
// 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 함수에 대해 예외 처리를 해주었다.

2. 이미지 저장

문제 상황

  1. 코드 효율성

순차적으로 실행되지 않아도 되는albumRepository.saveImageFilealbumRepository.getLabelsToList 가 순차적으로 실행되고 있었다.

  1. 예외 처리 부족

코루틴 동작 중 발생할 수 있는 예외 처리가 부족했다

  1. Service 종료 처리 미흡

예외 발생시 stopService(intent)를 호출해야 하지만, 제대로 처리되지 않았다.

해결 과정

  1. 병렬 처리 도입

async를 사용하여 saveImageFilegetLabelsToList 작업을 병렬로 처리

  1. 예외 처리

코루틴 실행 중 발생할 수 있는 예외는 CoroutineExceptionHandler로, asyncawait 에서 발생할 수 있는 예외는 runcatching으로 잡았고, 예외 발생 시 stopService 호출을 추가했다.

Clone this wiki locally