블록 내부의 모든 코루틴에 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은 영향을 받지 않는다. 따라서 위의 코드의 출력은 다음과 같다.

블록 내부의 모든 코루틴에 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은 영향을 받지 않는다. 따라서 위의 코드의 출력은 다음과 같다.
