android

Android Coroutine(코루틴)

Seon Dev Notes 2025. 2. 3. 00:18

오늘은 안드로이드 앱에서 비동기 작업을 보다 쉽고 효율적으로 처리할 수 있게 해주는 강력한 도구 Coroutine에 대해 알아보겠다.

코루틴

코루틴은 비동기적으로 실행되는 코드를 간소화하기 위해 Android에서 사용할 수 있는 동시 실행 설계 패턴이다.

코루틴의 기능

  1. 경량: 가볍고 효율적인 실행으로 스레드 차단 없이 비동기 처리한다.
  2. 메모리 누수 감소: 구조화된 동시성, 메모리 누수 걱정 없이 안전
  3. 내장된 취소 지원: 자동 취소 전파, 비동기 작업 간편하게 취소
  4. Jetpack 통합: Jetpack과 찰떡궁합, 안드로이드 개발 효율 올라감

코루틴 동작 과정

코루틴은 비동기 작업을 '일시 중단'과 '재개'라는 간단한 원리로 처리한다.

  • suspend 함수: suspend 키워드가 붙은 함수는 코루틴 내에서만 호출 가능하며, 코루틴을 일시 중단시킬 수 있다. 네트워크 요청 등 시간이 걸리는 작업은 보통 suspend 함수로 제공된다.
  • 코루틴 빌더: 코루틴을 시작하는 방법이다. launch는 결과를 반환하지 않는 코루틴을, async는 결과를 반환하는 코루틴을 실행한다.
    // launch 사용 예시
    fun fetchData() = runBlocking {
    launch {
        // 네트워크 요청
        delay(2000) // 2초 대기 시뮬레이션
        println("데이터 요청 완료")
    }
    }
  • 코루틴 스코프: 코루틴을 관리하는 영역이다. 코루틴 스코프를 사용하면 코루틴의 생명주기를 쉽게 관리하고, 메모리 누수를 방지할 수 있다.
    ex) 안드로이드에서는 ViewModelScope를 이용하여 뷰모델의 생명주기에 맞춰 코루틴을 관리할 수 있다.

코루틴의 예외 처리

코루틴에서 발생하는 에러는 try-catch 블록으로 처리할 수 있다. 코루틴 스코프의 CoroutineExceptionHandler를 사용하면 모든 코루틴에서 발생하는 예외를 한 번에 처리할 수도 있다.

class LoginViewModel(
    private val loginRepository: LoginRepository
): ViewModel() {

    fun login(username: String, token: String) {
        viewModelScope.launch {
            val jsonBody = "{ username: \"$username\", token: \"$token\"}"
            val result = try {
                loginRepository.makeLoginRequest(jsonBody)
            } catch(e: Exception) {
                Result.Error(Exception("Network request failed"))
            }
            when (result) {
                is Result.Success<LoginResponse> -> // Happy path
                else -> // Show error in UI
            }
        }
    }
}

코루틴 사용시 주의점

  • 무분별한 코루틴 생성은 성능 저하를 유발할 수 있다.
  • 코루틴 스코프를 적절히 사용하여 메모리 누수를 방지해야 한다.
  • UI 스레드에서 시간이 오래 걸리는 작업을 실행하지 않도록 주의해야 한다.

'android' 카테고리의 다른 글

Android Dagger & Hilt  (0) 2025.02.17
Android DI  (0) 2025.02.09
Android Kotlin  (0) 2025.02.01
Android MVVM  (1) 2024.12.30
Android MVP  (2) 2024.12.24