블록 내부의 모든 코루틴에 SupervisorJob()을 설정 : supervisorScope
앞선 12번글에서 SupervisorJob을 이용해 Error을 Handling하는 방법을 알았다. 하지만, 매번 CoroutineContext에 SupervisorJob을 설정할 필요 없이 특정 블록 내부의 모든 코루틴에 Supervisor Job을 설정하고 싶을 수 있다. 이 때 사용하는 것이 바로 supervisorScope이다.
<그림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은 영향을 받지 않는다. 따라서 위의 코드의 출력은 다음과 같다.
반응형