프로그래밍에서 비동기 처리는 매우 까다롭고 중요한 개념입니다. 다양한 언어에서 비동기를 처리 하기 위해 다양한 방법을 사용하며, 코루틴은 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 를 생성해서 사용하는 법에 대해 알아보도록 하겠습니다.
'Android.Kotlin' 카테고리의 다른 글
[Kotlin] 범위 지정 함수(scope function) 란? apply, run, let, with, also (0) | 2023.09.19 |
---|---|
[Android] Android Studio 이전 버전 다운로드 (0) | 2023.09.13 |
[Android] Coroutine Builder, Suspend 함수 이해하기 (0) | 2023.09.11 |
[Android] JetPack Compose 에서 상태 관리 (remember, rememberSaveable) (0) | 2023.09.05 |
[Android] JetPack Compose 에서 permission 요청하기 (0) | 2023.09.05 |