Redis 기반의 분산 락을 사용하면서,
코루틴이 중간에 취소될 경우 finally
블록에서 suspend 함수가 정상적으로 작동하지 않을 수 있다.
예시:
distributedLock.releaseLock(...)
이 finally
블록 내에서 실행되었으나,
내부에 delay()
혹은 await()
가 포함되어 코루틴이 취소된 상태에서는 실행되지 않음.Kotlin의 코루틴은 Job
을 기반으로 취소(cancellation)를 지원하며, 취소 상태에서는 delay()
, withContext
, await()
와 같은 취소 감지 가능한 suspend 함수들이 예외(CancellationException
)를 던지고 실행되지 않는다.
따라서 finally
블록 내부에서 이런 함수들을 호출하면 코루틴이 취소된 상태일 경우 해당 suspend 함수는 실행되지 않고 스킵될 수 있다.
이를 방지하기 위해 Kotlin은 withContext(NonCancellable)
블록을 제공하여,
코루틴이 취소된 상태에서도 suspend 함수를 실행할 수 있도록 한다.
사용한 이유:
try-finally
패턴을 통해 락 해제를 보장하려고 했음.작동 방식: