면접 질문실전 질문꼬리 질문

코루틴 취소와 CancellationException

skydovesJaewoong Eum (skydoves)||7분 소요

코루틴 취소와 CancellationException

코틀린 코루틴은 구조화된 동시성(structured concurrency)을 기반으로 한 협력적 취소(cooperative cancellation) 메커니즘을 통해 취소를 처리합니다. 취소가 발생하더라도 코루틴을 강제로 중단하는 것이 아니라, Job 계층 구조를 따라 취소 신호를 전파하고 각 코루틴이 suspend 지점(suspension point)에서 해당 신호를 관찰하는 방식으로 동작합니다. 이 과정에서 CancellationException이 어떤 역할을 하는지는 코루틴 에러 처리에서 가장 흔히 오해받는 부분 중 하나이며, 면접에서도 자주 등장하는 주제입니다. 이번 면접 질문을 통하여 아래 내용들을 학습하실 수 있습니다.

  • Job 계층 구조를 따라 취소가 하위로 전파되는 원리를 설명할 수 있습니다.
  • ensureActive()와 suspend 지점이 취소를 관찰 가능하게 만드는 방식을 이해할 수 있습니다.
  • childCancelled()에서 CancellationException이 다른 예외와 다르게 처리되는 이유를 파악할 수 있습니다.
  • CancellationException을 무시하고 삼켜버렸을 때 발생하는 문제를 식별할 수 있습니다.
  • suspend 함수 정리 작업에서 withContext(NonCancellable)을 올바르게 적용할 수 있습니다.

Job 계층 구조와 취소 전파

구조화된 동시성은 코루틴을 부모-자식 트리 형태로 구성합니다. 모든 코루틴은 자신의 컨텍스트 안에 Job을 가지고 있으며, 특정 스코프 내에서 코루틴을 launch하면 새로 생성된 Job이 해당 스코프의 Job에 자식으로 등록됩니다.

job.cancel()을 호출하면 런타임 내부에서 cancelImpl()이 호출되고, 해당 Job의 상태가 취소 중(cancelling)으로 전환됩니다. 이어서 cancelChildren()을 통해 모든 자식에게 취소 신호가 전파됩니다.

private fun cancelChildren(cause: CancellationException?) {
    children.forEach { child ->
        child.cancel(cause)
    }
}

각 자식 Jobcancel()을 수신하면 자신도 취소 중 상태로 전환하고, 다시 자신의 자식들에게 cancelChildren()을 호출합니다. 이 신호는 전체 서브트리를 동기적으로 순회하면서 전파됩니다. 이 단계가 완료되면 계층 구조 내 모든 Job이 취소 중으로 표시되지만, 실제로 코루틴의 실행이 멈춘 것은 아직 아닙니다. 실제 취소가 이루어지려면 코루틴이 suspend 지점에 도달해야 하며, 이 부분이 바로 협력적 취소의 핵심입니다.

Suspend 지점과 ensureActive()

코틀린에서 취소는 협력적(cooperative)입니다. 코루틴이 취소 신호를 스스로 관찰해야만 실제로 취소가 이루어진다는 뜻입니다. 이러한 관찰은 suspend 지점에서 ensureActive()를 통해 수행됩니다.

public fun Job.ensureActive(): Unit {
    if (!isActive) throw getCancellationException()
}

delay(), yield(), withContext(), await() 같은 표준 라이브러리 함수들은 내부적으로 모두 ensureActive()를 호출합니다. Job이 취소 중 상태일 때 isActivefalse를 반환하고, ensureActive()CancellationException을 던집니다.

반대로 suspend 지점에 전혀 도달하지 않는 코루틴은 취소될 수 없습니다. 이 점은 면접에서도 자주 물어보는 부분이므로 반드시 기억해 두셔야 합니다. 긴밀한 반복문(tight loop)을 협력적으로 만들려면 명시적인 검사를 추가해야 합니다.

이 면접 질문은 구독자 전용입니다

Dove Letter를 구독하시면 안드로이드, 코틀린 개발 관련 독점 면접 질문의 전체 내용을 볼 수 있습니다.

구독하기