PHpullh
학습 라이브러리/Kotlin/SupervisorScope 심화

KOTLIN · 비동기

SupervisorScope 심화

supervisorScopeSupervisorJob의 차이점과 올바른 사용법을 다룹니다.

비동기고급supervisorScopesupervisorerror-isolationparallel

핵심 설명

supervisorScopeSupervisorJob의 차이점과 올바른 사용법을 다룹니다.

Kotlin code

import kotlinx.coroutines.*

fun main() = runBlocking {
    println("=== supervisorScope ===")
    supervisorScope {
        val job1 = launch {
            delay(100)
            throw RuntimeException("작업1 실패")
        }
        val job2 = launch {
            delay(200)
            println("작업2 완료!")  // 실행됨
        }
        val job3 = launch {
            delay(300)
            println("작업3 완료!")  // 실행됨
        }

        // 개별 예외 처리
        try { job1.join() } catch (e: Exception) {
            println("job1 오류: ${e.message}")
        }
        job2.join()
        job3.join()
    }

    println("
=== 개별 try-catch ===")
    coroutineScope {
        val results = listOf("A", "B", "ERROR", "C").map { item ->
            async(SupervisorJob()) {
                if (item == "ERROR") throw RuntimeException("$item 실패")
                delay(100)
                "처리: $item"
            }
        }
        results.forEach { deferred ->
            runCatching { deferred.await() }
                .onSuccess { println(it) }
                .onFailure { println("실패: ${it.message}") }
        }
    }
}

학습 팁

supervisorScope는 자식의 실패를 격리합니다. 여러 독립 API 호출을 병렬 실행하고 일부 실패를 허용할 때 사용하세요.

주의할 점

async(SupervisorJob())으로 독립 Deferred를 만들면 부모와의 구조가 깨집니다. 가능하면 supervisorScope 내에서 async를 사용하세요.

자주 묻는 질문

SupervisorScope 심화란 무엇인가요?

supervisorScope 와 SupervisorJob 의 차이점과 올바른 사용법을 다룹니다.

SupervisorScope 심화 학습 시 주의할 점은 무엇인가요?

async(SupervisorJob()) 으로 독립 Deferred를 만들면 부모와의 구조가 깨집니다. 가능하면 supervisorScope 내에서 async 를 사용하세요.