반응형

kotlin android coding

Kotlin Coroutines 실무 가이드

요약: Android 개발에서 Kotlin Coroutines를 효과적으로 사용하는 방법과 자주 발생하는 실수를 정리했습니다.


1. 기본 개념

Coroutines는 경량 스레드로, 비동기 코드를 동기 코드처럼 작성할 수 있게 해줍니다.

// 기본 사용법
lifecycleScope.launch {
    val result = withContext(Dispatchers.IO) {
        // 네트워크 요청 등 무거운 작업
        api.fetchData()
    }
    // UI 업데이트 (Main 스레드)
    textView.text = result
}

2. Dispatcher 선택 가이드

  • Dispatchers.Main: UI 업데이트, 가벼운 작업
  • Dispatchers.IO: 네트워크, 파일 I/O, 데이터베이스
  • Dispatchers.Default: CPU 집약적 작업 (정렬, 파싱 등)
// 잘못된 예 - Main에서 무거운 작업
lifecycleScope.launch {
    val data = api.fetchData() // ANR 발생 가능!
}

// 올바른 예
lifecycleScope.launch {
    val data = withContext(Dispatchers.IO) {
        api.fetchData()
    }
}

3. 예외 처리

Coroutines에서 예외 처리는 중요합니다. 처리되지 않은 예외는 앱 크래시로 이어집니다.

val handler = CoroutineExceptionHandler { _, exception ->
    Log.e("Coroutine", "Error: ${exception.message}")
}

lifecycleScope.launch(handler) {
    // 예외 발생 가능한 코드
}

// 또는 try-catch 사용
lifecycleScope.launch {
    try {
        val result = api.fetchData()
    } catch (e: Exception) {
        showError(e.message)
    }
}

4. 취소 처리

화면 이동 시 진행 중인 작업을 취소해야 메모리 누수를 방지할 수 있습니다.

// lifecycleScope 사용 시 자동 취소
lifecycleScope.launch {
    // Activity/Fragment 종료 시 자동 취소
}

// 수동 취소가 필요한 경우
val job = CoroutineScope(Dispatchers.IO).launch {
    while (isActive) { // 취소 상태 확인
        // 작업 수행
    }
}
job.cancel() // 명시적 취소

5. Flow 활용

실시간 데이터 스트림에는 Flow를 사용하세요.

// Repository
fun getDataFlow(): Flow<List<Item>> = flow {
    while (true) {
        emit(api.fetchData())
        delay(5000) // 5초마다 갱신
    }
}.flowOn(Dispatchers.IO)

// ViewModel
viewModelScope.launch {
    repository.getDataFlow()
        .catch { e -> _error.value = e.message }
        .collect { data -> _items.value = data }
}

자주 하는 실수

  • GlobalScope 남용 - 메모리 누수 원인
  • Main 스레드에서 블로킹 호출
  • 예외 처리 누락으로 인한 크래시
  • 취소 상태(isActive) 미확인

참고 자료


작성: 밤비스

반응형

+ Recent posts