[Android] Job과 SupervisorJob

MariGold·2025년 12월 3일

[Android]

목록 보기
7/12
post-thumbnail

Android 코루틴(Coroutine)에서 Job은 가장 기본적인 '작업 단위'이자 코루틴의 생명주기를 관맇나느 역할을 하는 객체입니다. 특히 여러 코루틴이 함께 실행될 때, 어떤 방식으로 실패를 전파할지 결정하는 매우 중요한 요소이기도 합니다. 이번 글에서는 JobSupervisorJob이 어떤 차이를 가지는지, 그리고 언제 어떤 것을 사용해야 하는지 예제와 함께 정리해보겠습니다.


🚀 Job이란?

Job은 코루틴 생성 시 자동으로 만들어지며, 코루틴의 취소, 완료, 실패 상태를 관리합니다.
특징은 다음과 같습니다.

  • 부모 코루틴이 취소되면 자식 코루틴도 모두 취소됨
  • 자식 코루틴 중 하나가 실패하면 부모와 형제 코루틴까지 전파됨 (즉, 실패 전파(Failure Propagation)구조를 가짐)
val scope = CoroutineScope(Dispatchers.Default + Job())

scope.launch {
    launch {
        delay(100)
        println("Task 1 시작")
        throw RuntimeException("Task 1 실패!")
    }

    launch {
        println("Task 2 실행 중...")
        delay(1000)
        println("Task 2 완료")
    }
}

➡️ Task 1이 실패하면
➡️ 부모 Job이 취소되고
➡️ Task 2도 자동 취소됨

위의 예제처럼 하나의 실패가 전체 작업을 날려버리는 구조입니다.


🚀 SupervisorJob이란?

SupervisorJob은 자식 코루틴 간의 실패 전파를 막아주는 특별한 Job입니다. SupervisorJob의 특징은 다음과 같습니다.

  • 자식 코루틴 중 하나가 실패해도 다른 자식에게 영향을 주지 않음
  • 부모는 자식의 실패에 의해 자동 취소되지 않음
  • Android viewModelScope가 내부적으로 사용하는 Job 구조

즉, 독립적인 병렬 작업을 처리할 때 매우 유용합니다.

val scope = CoroutineScope(Dispatchers.Default + SupervisorJob())

scope.launch {
    launch {
        delay(100)
        println("Task 1 시작")
        throw RuntimeException("Task 1 실패!")
    }

    launch {
        println("Task 2 실행 중...")
        delay(1000)
        println("Task 2 완료")  // 정상 출력됨
    }
}

➡️ Task 1이 실패해도
➡️ Task 2는 자기 일 계속함

Job과 다르게 SupervisorJob은 하나의 Task가 실패해도 다른 Task는 정상적으로 동작합니다. Android는 viewModelScope에 기본적으로 SupervisorJob을 사용하고 있습니다. ViewModel에서는 다음과 같은 작업이 동시에 실행되는 경우가 많습니다.

  • 여러 API 병렬 호출
  • UI 업데이트 + 데이터 저장 작업 병행
  • 하나의 실패가 전체 앱 행동을 망치면 안되는 상황

예를 들어, API A가 실패했다고 해서, 동시에 진행 중인 API B나 로컬 DB작업까지 취소되는 것은 위험합니다. 그래서 Android는 viewModelScope 내부에 자연스럽게 SupervisorJob을 사용해 하나의 실패로 인해 전체가 무너지는 일을 막습니다.


🔧 언제 무엇을 써야할까?

Job을 써야 하는 경우
1. 부모-자식이 하나의 큰 작업으로 묶인 경우 (예: "모두 성공해야 하는 단일 트랜잭션 작업")
2. 실패 시 전체 취소가 더 안전한 작업

SupervisorJob을 써야 하는 경우
1. 병렬 작업이 서로 독립적일 때
2. Android ViewModel과 같은 UI 계층
3. 여러 API를 병렬로 호출해서 일부 실패해도 앱이 정상 동작해야 할 때


📌 결론

Job과 SupervisorJob은 단순히 "코루틴을 만든다"란큰 개념을 넘어, 코루틴 간의 실패 전파 방식과 생명주기 구조를 어떻게 구성할 것인가를 결정하는 핵심 요소입니다. 마지막으로 정리를 하자면

  • Job → 하나 실패하면 전체 취소되는 일괄 구조
  • SupervisorJob → 실패가 전파되지 않는 독립 구조

이렇게 구성됩니다. 실제 앱 개발에서는 상황에 맞는 Job을 선택하는 것이 앱 안정성과 사용자 경험에 영향을 미칠 수 있습니다.

profile
많은 것을 알아가고 싶은 Android 주니어 개발자

0개의 댓글