본문 바로가기
Android.Kotlin

[Android] Kotlin CoroutineScope 에 대해 알아보자

by 동동하다 2023. 9. 8.
반응형

프로그래밍에서 비동기 처리는 매우 까다롭고 중요한 개념입니다. 다양한 언어에서 비동기를 처리 하기 위해 다양한 방법을 사용하며, 코루틴은 Kotlin 에서 비동기를 처리하는 방식입니다.

그럼 CoroutionScope 는 무엇일까요? Scope 라는 말 그대로 비동기를 실행하기 위한 작업 범위 입니다. 비동기 작업을 해당 Scope (범위) 에서 실행해라. 이는 무분별한 비동기 처리로 인한 메모리 누수와 리소스 낭비를 막기 위함입니다. 사용자는 CoroutineScope 를 설정하고 특정 수명 주기에 따라 실행, 취소, 재실행 등을 할 수 있습니다.

 

그럼 CoroutineScope 의 종류에는 어떤것이 있을까요?

 

GlobalScope

안드로이드에서 CoroutineScope 를 설정하지 않아도 기본적으로 사용할 수 있는 CoroutineScope 입니다. 사실 설정하지 않아도 사용할 수 있다는 것은 싱글톤으로 이미 정의 되었다는 것입니다. 

@DelicateCoroutinesApi
public object GlobalScope : CoroutineScope {
    /**
     * Returns [EmptyCoroutineContext].
     */
    override val coroutineContext: CoroutineContext
        get() = EmptyCoroutineContext
}

위에서 보듯이 GloablScope 도 결국은 CoroutineScope 를 상속하기에 CoroutineScope 의 한 종류입니다. 

GlobalScope 는 앱이 실행되고 종료될 때까지 실행할 수 있는 scope 입니다. 그렇기에 가볍게 사용할 수 있지만 무분별하게 사용하게 되면 위에서 말한 메모리 누수 및 오류를 초래할 수 있습니다. 그래서 사실상 추천하는 방법은 아니며, CoroutineScope 의 취지와도 맞지 않습니다.

fun coroutineTest() {
    GlobalScope.launch {
        delay(1000)
        println("GlobalScope test")
    }
}

 

ViewModelScrop

비동기 프로그래밍에서 가장 대표적인 예시는 네트워크 통신입니다.
Android 에서 네트워크 통신은 구조적으로 ViewModel 에서 이루어지며, ViewModelScope 는 ViewModel 에서 비동기 네트워크 통신시 사용되는 CoroutineScope 입니다. 

ViewModelScope 의 생명주기는 ViewModel 와 동일하여, ViewModel 이 제거되면 모든 코루틴 작업이 자동 취소 됩니다.

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

    fun login(username: String, token: String) {
        // Create a new coroutine to move the execution off the UI thread
        viewModelScope.launch(Dispatchers.IO) {
            val jsonBody = "{ username: \"$username\", token: \"$token\"}"
            loginRepository.makeLoginRequest(jsonBody)
        }
    }
}

 

LifecycleScope

Lifecycle이 존재하는 Activity 나 Fragment 의 수명주기에 따라 자동으로 코루틴을 시작하고 취소할 수 있는 Scope 입니다.

class MyActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_my)

        lifecycleScope.launch {
            delay(1000)
        }
    }
}

위 lifecycleScope 는 Activity 악 onDestory 될 때 해제되어 내부 작업들이 취소됩니다. 이 말인즉, 앱이 백그라운드로 내려가거나 onPause 되는 경우에는 코루틴이 계속 실행된다는 말이니 사용에 주의해야 합니다.

 

위에 소개한 Scope 들은 미리 정의된 scope 들 입니다. 이런 Scope 들은 보편적으로 많이 쓰일 수 있는 환경을 예상해서 미리 만들어 둔 것입니다. 하지만 위의 Scope 만으로 모든 상황에서 쓸 수 있지는 않을겁니다. 그렇다면 Custom 하게 생성해서 사용 할 수 있어야 합니다. 다음에는 CoroutineScope 를 생성해서 사용하는 법에 대해 알아보도록 하겠습니다.

반응형