Image
Coroutines/Coroutine Basics

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

블록 내부의 모든 코루틴에 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 예시 로그

반응형

 

이 글의 저작권은 '조세영의 Kotlin World' 에 있습니다. 글, 이미지 무단 재배포 및 변경을 금지합니다.

 

 

Kotlin, Android, Spring 사용자 오픈 카톡

오셔서 궁금한 점을 질문해보세요!
비밀번호 : kotlin22

open.kakao.com