Develop/Kotlin

[kotlin] 코틀린 Android 코루틴(Coroutine) 활용

JunJangE 2021. 11. 19. 20:46

이번에는 코틀린에서 자주 사용되는 코루틴(Coroutine)에 대해서 알아보도록 하자.

코루틴은 스레드와 기능적으로 비슷하지만 하나의 스레드 내에서 여러 개의 코루틴이 실행되는 개념으로 비동기 프로그래밍에 권장하는 동시 실행 설계 패턴이다. 이전에 알아보았던 MVVM 패턴에서도 코루틴을 사용하여 텍스트를 DB에 저장할 때 사용된 것을 확인할 수 있다. 코루틴은 단일 스레드 내에서 여러 개의 코루틴을 실행할 수 있기 때문에, 많은 양의 동시 작업을 처리할 수 있으면서 메모리 절약의 장점이 있다. 쉽게 생각해서 하나의 스레드 내에 여러 개의 코루틴을 통해 작업을 할 수 있는 것이다.

코루틴에 대해서 간단하게 알아보았으니 활용하는 방법에 대해서 알아보도록 하자.

Gradle 설정

우선 프로젝트를 하나 생성하고 build.gradle(Module) 파일에 다음 코드를 적고 우측 상단에 있는 'Sync Now'를 누른다.

    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2' // Coroutine
    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0' // ViewModelScope
    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0' // LifecycleScope
    implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0' // liveData

CoroutineContext

코루틴 스코프에 기본적인 코드는 다음과 같다.

CoroutineScope(Dispatchers.스레드 종류).상태관리 {

}

Dispatchers는 코루틴을 통해 어떤 스레드를 실행할 것인지, 동작을 정의하는 것이다.

스레드의 종류는 3가지 등이 있다.

Dispatchers.Main : 메인 스레드, 화면 UI 작업

Dispatchers.IO : 네트워크, DB 등 백그라운드 작업 

Dispatchers.Default : 정렬이나 무거운 계산 작업

CoroutineBuilder

코루틴의 상태 관리 키워드는 2가지로 나뉘고 코루틴을 생성하고 상태 관리 메서드를 호출해서 중단, 지연할 수 있다.

- launch : 상태 관리

CoroutineScope(Dispatchers.Main).launch {
        // 결과 값이 필요없는 작업
}

launch는 상태 관리만을 하는 것으로 결과 값이 필요없는 작업을 할 때 사용된다.

- async : 상태 관리 + 결과

CoroutineScope(Dispatchers.Main).async {
  val a = async {
     // 결과 값이 필요한 작업
    "Hello!"
   }
   
   Log.d("ttt", a.await())
}

async는 상태 관리뿐만 아니라 결과 값이 필요한 작업을 할 때 사용된다.

CoroutinScope

CoroutineScope(Dispatchers.IO).async {
 
}

예를 들어 위 코드의 대해 알아보면 코루틴을 통해 네트워크 작업을 하는 스레드를 상태 관리 + 결과 값을 얻게 한 것이다.

다음으로는 코루틴을 실행하고 싶은 Lifecycle을 정해 원하는 스코프를 생성하여 코루틴이 실행되게끔하는 코드를 알아보도록 해보자. dependencies에 추가해야하는 코드는 위에 Gradle 설정에 작성해 놓았다.

GlobalScope

// 앱의 라이프사이클동안 실행될 Scope
GlobalScope.launch {
    // 백그라운드로 전환하여 작업
    launch(Dispatchers.IO) {

    }

    // 메인쓰레드로 전환하여 작업
    launch(Dispatchers.Main) {

    }
}

앱이 실행될 때부터 종료될 때까지 실행한다.

ViewModelScope

class MyViewModel: ViewModel() {
    init {
        viewModelScope.launch {
            // ViewModel이 제거되면 코루틴도 자동으로 취소됩니다.
        }
    }
}

ViewModel 대상, ViewModel이 제거되면 코루틴 작업이 자동으로 종료된다.

LifecycleScope

class MainActivity : AppCompatActivity() {
    private val viewModel: MainViewModel by viewModels()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        lifecycleScope.launch { 
            
        }
    }
}

Lifecycle 객체 대상(Actitvity, Fragment, Service..) Lifecycle이 끝날 때 코루틴 작업이 자동으로 종료된다.

suspend fun

suspend function는 코루틴 안에서만 실행할 수 있는 코루틴 전용 메서드라서 suspend 메서드는 일반적인 곳에서 호출할 수 없으며, 반드시 코루틴 안에서만 호출이 가능하다. suspend 함수가 호출될 경우 이전까지의 코드의 실행이 멈추며 suspend 함수가 처리가 완료된 후에 멈춰 있던 스코프의 다음 코드가 실행된다.

마무리하면서 코루틴을 사용할 때는 어떤 Lifecycle에 코루틴을 사용할지 정하고 어떤 스레드에서 사용할 것인지 결과 값을 원하는지에 대해 생각하고 코드를 작성하면 될 것 같다.

참고

 

Android의 Kotlin 코루틴  |  Android 개발자  |  Android Developers

Android의 Kotlin 코루틴 코루틴은 비동기적으로 실행되는 코드를 간소화하기 위해 Android에서 사용할 수 있는 동시 실행 설계 패턴입니다. 코루틴은 Kotlin 버전 1.3에 추가되었으며 다른 언어에서 확

developer.android.com

 

수명 주기 인식 구성요소와 함께 Kotlin 코루틴 사용  |  Android 개발자  |  Android Developers

수명 주기 인식 구성요소와 함께 Kotlin 코루틴 사용 Kotlin 코루틴은 비동기 코드를 작성할 수 있게 하는 API를 제공합니다. Kotlin 코루틴을 사용하면 코루틴이 실행되어야 하는 시기를 관리하는 데

developer.android.com