KOTLIN · 비동기
코루틴 예외 처리 — SupervisorJob
일반 Job은 자식 코루틴의 예외가 부모와 형제를 모두 취소하지만, SupervisorJob은 실패한 자식만 취소합니다. 독립적인 작업들을 병렬로 실행할 때 한 작업의 실패가 전체에 영향을 주지 않도록 설계할 수 있습니다.
핵심 설명
일반 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()
}학습 팁
supervisorScope는 coroutineScope의 supervisor 버전입니다. 자식 코루틴의 예외를 개별적으로 try-catch로 처리할 수 있으며, CoroutineExceptionHandler를 함께 사용하면 전역 에러 로깅이 가능합니다.
주의할 점
SupervisorJob은 직접 자식에게만 적용됩니다. 손자 코루틴은 일반 Job 규칙을 따르므로, 중첩된 구조에서는 각 레벨에 supervisor 전략을 명시적으로 적용해야 합니다.
자주 묻는 질문
코루틴 예외 처리 — SupervisorJob란 무엇인가요?
일반 Job 은 자식 코루틴의 예외가 부모와 형제를 모두 취소하지만, SupervisorJob 은 실패한 자식만 취소합니다. 독립적인 작업들을 병렬로 실행할 때 한 작업의 실패가 전체에 영향을 주지 않도록 설계할 수 있습니다.
코루틴 예외 처리 — SupervisorJob 학습 시 주의할 점은 무엇인가요?
SupervisorJob 은 직접 자식에게만 적용됩니다. 손자 코루틴은 일반 Job 규칙을 따르므로, 중첩된 구조에서는 각 레벨에 supervisor 전략을 명시적으로 적용해야 합니다.
Continue Learning
Kotlin 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.