[Android] WithTimeout, WithTimeoutOrNull

MariGold·2025년 12월 30일

[Android]

목록 보기
20/20
post-thumbnail

네트워크 요청, DB 조회, 사용자 입력 대기 등 언제 끝날지 알 수 없는 작업을 다루는 경우가 있습니다. 이런 작업이 오래 걸리면

  • 화면이 멈춘 것처럼 보이거나
  • 불필요한 리소스를 계속 사용하거나
  • UX 저해

위와 같은 문제가 발생할 수 있습니다. Coroutine에서는 이런 문제를 해결하기 위해 WithTimeout과 WithTimeoutOrNull을 제공합니다. 이번 글에서는 WithTimeout과 WithTimeoutOrNull이 무엇이고, 어떻게 사용하는지 알아보겠습니다.


🚀 WithTimeout이란?

WithTimeout은 지정한 시간 안에 작업이 끝나지 않으면 코루틴(Coroutine)을 자동으로 취소하는 기능입니다. 코루틴은 기본적으로 취소 가능한 구조(cancellable) 를 가지고 있고, WithTimeout은 이 특성을 이용해 시간 제한을 안전하게 적용합니다.

try {
    withTimeout(3000) {
        delay(5000)
        println("실행되지 않음")
    }
} catch (e: TimeoutCancellationException) {
    println("타임아웃 발생! 하지만 프로그램은 계속 실행됩니다.")
}

시간이 초과되면 TimeoutCancellationException이 발생하며 try-catch를 통해 프로그램이 죽지 않게 하거나 후속 작업이 작동되도록 할 수 있습나다.


🚀 WithTimeoutOrNull이란?

WithTimeoutOrNull은 시간이 초과되면 null을 반환합니다.

val result = withTimeoutOrNull(3000) {
    delay(5000)
    "성공"
}

println(result) // null

⚠️ Timeout이 동작하지 않는 경우

Timeout은 취소 가능한 suspend 함수에서만 정상 동작합니다.

withTimeout(1000) {
    Thread.sleep(5000) // ❌ 취소 불가
}

withTimeout(1000) {
    delay(5000) // ✅ 취소 가능
}

🎯 마무리

Timeout은 단순히 “시간 제한” 기능이 아니라 UI를 안전하게 보호하기 위한 필수 장치입니다.

  • withTimeout → 시간 초과 시 예외
  • withTimeoutOrNull → 시간 초과 시 null

Compose와 ViewModel 기반의 구조에서는 timeout을 명시적으로 설정하는 것만으로도 UI 안정성이 크게 향상됩니다. 상태 중심 UI인 만큼, 언제 값을 수집할지뿐 아니라 언제 포기할지도 명확히 하는 것이 중요합니다.

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

0개의 댓글