반응형
Kotlin 코루틴의 장기 실행 작업 관리
Kotlin 코루틴을 사용하면 네트워크 호출이나 디스크 작업 같은 장기 실행 작업을 관리하면서도 간소화된 비동기 코드 작성이 가능합니다.
1. suspend 함수란?
- suspend fun 은 일시 중단 가능한 함수입니다.
- 함수 실행 중에 잠깐 멈췄다가 다시 이어서 실행할 수 있게 만듭니다.
- 예를 들어, 네트워크 요청, 디스크 IO 등 오래 걸리는 작업을 UI 멈추지 않고 수행할 수 있습니다.
suspend fun fetchDocs() { // Dispatchers.Main
val result = get("https://developer.android.com") // Dispatchers.IO for `get`
show(result) // Dispatchers.Main
}
suspend fun get(url: String) = // Dispatchers.Main
withContext(Dispatchers.IO) { // Dispatchers.IO (main-safety block)
/* perform network IO here */ // Dispatchers.IO (main-safety block)
} // Dispatchers.Main
}
2. suspend 함수는 그냥 호출 가능한가요?
- 일반 함수에서는 suspend fun 을 직접 호출할 수 없습니다.
- launch, async 같은 코루틴 빌더 안에서 호출해야 합니다.
fun callSuspend() {
CoroutineScope(Dispatchers.Main).launch {
val result = fetchData() // suspend 함수 호출
Log.d("Result", result)
}
}
3. invoke, call, resume 이란?
- invoke -> 호출됨, suspend -> 멈춤, resume -> 다시 실행
코루틴 내부적으로 suspend, resume, invoke 같은 복잡한 동작을 하지만,
suspend, launch, withContext 등을 통해 자동으로 처리해주기에 신경쓰지 않아도 됩니다.
Dispatcher 사용 원칙과 흐름 제어
Kotlin 코루틴은 어떤 스레드에서 실행할지 Dispatcher 로 제어하며,
메인 스레드에서 함수를 호출하더라도 내부에서 적절한 Dispatcher 로 전환하면 안전하게 무거운 작업을 수행할 수 있습니다.
- Dispatcher.Main : UI와 상호 작용하고 빠른 작업을 수행하는 경우에만 사용
예를 들어, suspend 함수 호출, Android UI 프레임워크 작업 실행, LiveData 객체 업데이트 - Dispatcher.IO : 메인 스레드 외부에서 디스크 또는 네트워크 I/O 실행시에 사용
예를 들어, Room 구성 요소 사용, 파일 읽기/쓰기, 네트워크 작업 실행 - Dispatcher.Default : 메인 스레드 외부에서 CPU 사용량이 많은 작업을 수행
예를 들어, 목록 정렬, JSON 파싱
withContext 를 사용한 성능
withContext() 는 코루틴 코드 블록이 어떤 디스패처에서 실행될지 정할 수 있게 해주는 기능입니다.
suspend 함수라고 해서 백그라운드에서 실행되는 건 아니며, 디스패처를 명시하지 않으면 메인 스레드에서 실행됩니다.
디스크에서 읽거나 쓰거나, 네트워크 작업을 수행하거나, CPU 사용량이 많은 작업을 실행할때는 withContext 사용이 필요합니다.
동등한 콜백 기반 구현에 비해 오버헤드가 발생하지 않습니다. 실제로는 경우에 따라 더 최적화할 수 있습니다.
코루틴의 시작
- launch : 결과가 필요 없는 코루틴의 시작
반환 값이 없고, 단순히 어떤 작업을 비동기로 실행
UI 업데이트, 로그 전송, 알림 보내기 등 결과를 기다릴 필요 없는 작업에 적합
CoroutineScope(Dispatchers.Main).launch {
fetchData()
updateUI()
}
- async : 결과가 필요한 경우
Deferred<T> 를 반환하므로 결과를 await() 으로 받을 수 있음
await() 는 suspend 함수이므로 다른 코루틴 안에서만 호출 가능
병렬 실행, 결과 조합 등 복잡한 작업에서 유용
val deferred = CoroutineScope(Dispatchers.IO).async {
fetchData()
}
val result = deferred.await() // suspend 함수 안에서만 호출 가능반응형
'Android > platform' 카테고리의 다른 글
| [Android] 백그라운드 작업 처리 : Coroutines 와 WorkManager 비교 (0) | 2025.04.16 |
|---|---|
| [Android] WorkManager로 백그라운드 작업 처리 (0) | 2025.04.16 |
| [Android] 백그라운드 서비스 (Background Service) 란? 포그라운드 서비스와의 차이점 (0) | 2024.12.02 |
| [Android] 바인딩 서비스 (Bound Service) 란? 포그라운드 서비스와의 차이점 (1) | 2024.12.02 |
| [Android] 포그라운드 서비스(Foreground Service) 개요 및 구현 방법 (1) | 2024.11.29 |