Coroutines/Coroutine Basics

[Coroutine] 13. supervisorScope를 이용한 Coroutine Exception Handling

Dev.Cho 2021. 8. 22. 19:37
반응형

블록 내부의 모든 코루틴에 SupervisorJob()을 설정 : supervisorScope

앞선 12번글에서 SupervisorJob을 이용해 Error을 Handling하는 방법을 알았다. 하지만, 매번 CoroutineContext에 SupervisorJob을 설정할 필요 없이 특정 블록 내부의 모든 코루틴에 Supervisor Job을 설정하고 싶을 수 있다. 이 때 사용하는 것이 바로 supervisorScope이다.

 

그림1. SupervisorJob 내부의 모든 코루틴에 SupervisorJob 설정

 

<그림1>과 같이 supervisorScope 내부에 코루틴이 있다면 모든 코루틴은 SupervisorJob의 적용을 받게된다.

 

예를들어 아래와 같은 코드가 있다고 해보자.

suspend fun main() {
    CoroutineScope(Dispatchers.IO).launch { // 부모 코루틴은 supervisorScope 외부에 있어 SupervisorJob() 적용 안됨
    
        supervisorScope {
            val firstChildJob = launch { // 자식 코루틴은 supervisorScope 내부에 있어 SupervisorJob 적용됨
                throw AssertionError("첫 째 Job이 AssertionError로 인해 취소됩니다.")
            }

            val secondChildJob = launch(Dispatchers.Default) { // 자식 코루틴은 supervisorScope 내부에 있어 SupervisorJob 적용됨
                delay(1000)
                println("둘 째 Job이 살아있습니다.")
            }

            firstChildJob.join()
            secondChildJob.join()
        }
    }.join()
}

supervisorScope내부에 firstChildJob과 secondChildJob 코루틴이 존재한다. supervisorScope 외부에는 부모 코루틴이 존재한다. 따라서 자식들은 모두 SupervisorJob()의 적용을 받으며, 부모 코루틴은 적용을 받지 않는다.

 

따라서 위 코드의 자식 코루틴인 firstChildJob에서 Exception이 발생되더라도 부모 코루틴으로 전파되지 않아 부모 코루틴의 다른 자식 코루틴 secondChildJob은 영향을 받지 않는다. 따라서 위의 코드의 출력은 다음과 같다.

그림2. supervisorScope 예시 로그

반응형