PHpullh
학습 라이브러리/Kotlin/코루틴 예외 처리 — SupervisorJob

KOTLIN · 비동기

코루틴 예외 처리 — SupervisorJob

일반 Job은 자식 코루틴의 예외가 부모와 형제를 모두 취소하지만, SupervisorJob은 실패한 자식만 취소합니다. 독립적인 작업들을 병렬로 실행할 때 한 작업의 실패가 전체에 영향을 주지 않도록 설계할 수 있습니다.

비동기고급coroutinessupervisorexception-handlingstructured-concurrency

핵심 설명

일반 Job은 자식 코루틴의 예외가 부모와 형제를 모두 취소하지만, SupervisorJob은 실패한 자식만 취소합니다. 독립적인 작업들을 병렬로 실행할 때 한 작업의 실패가 전체에 영향을 주지 않도록 설계할 수 있습니다.

Kotlin code

import kotlinx.coroutines.*

fun main() = runBlocking {
    println("=== 일반 Job: 하나 실패 → 전체 취소 ===")
    try {
        coroutineScope {
            launch {
                delay(100)
                throw RuntimeException("작업1 실패!")
            }
            launch {
                delay(200)
                println("작업2 완료") // 실행되지 않음
            }
        }
    } catch (e: RuntimeException) {
        println("예외 포착: ${e.message}")
    }

    println()
    println("=== SupervisorJob: 실패한 자식만 취소 ===")
    supervisorScope {
        val job1 = launch {
            delay(100)
            throw RuntimeException("작업A 실패!")
        }
        val job2 = launch {
            delay(200)
            println("작업B 완료!") // 정상 실행됨
        }

        // 개별 예외 처리
        job1.join()
        job2.join()
    }

    println()
    println("=== CoroutineExceptionHandler 활용 ===")
    val handler = CoroutineExceptionHandler { _, exception ->
        println("전역 핸들러: ${exception.message}")
    }

    val supervisor = SupervisorJob()
    val scope = CoroutineScope(coroutineContext + supervisor + handler)

    scope.launch { throw ArithmeticException("계산 오류") }
    scope.launch {
        delay(100)
        println("다른 작업 정상 실행!")
    }

    delay(200)
    supervisor.cancel()
}

학습 팁

supervisorScopecoroutineScope의 supervisor 버전입니다. 자식 코루틴의 예외를 개별적으로 try-catch로 처리할 수 있으며, CoroutineExceptionHandler를 함께 사용하면 전역 에러 로깅이 가능합니다.

주의할 점

SupervisorJob은 직접 자식에게만 적용됩니다. 손자 코루틴은 일반 Job 규칙을 따르므로, 중첩된 구조에서는 각 레벨에 supervisor 전략을 명시적으로 적용해야 합니다.

자주 묻는 질문

코루틴 예외 처리 — SupervisorJob란 무엇인가요?

일반 Job 은 자식 코루틴의 예외가 부모와 형제를 모두 취소하지만, SupervisorJob 은 실패한 자식만 취소합니다. 독립적인 작업들을 병렬로 실행할 때 한 작업의 실패가 전체에 영향을 주지 않도록 설계할 수 있습니다.

코루틴 예외 처리 — SupervisorJob 학습 시 주의할 점은 무엇인가요?

SupervisorJob 은 직접 자식에게만 적용됩니다. 손자 코루틴은 일반 Job 규칙을 따르므로, 중첩된 구조에서는 각 레벨에 supervisor 전략을 명시적으로 적용해야 합니다.