이번에는 드디어 이전 예제들에서 사용해왔던 viewModelScope에 대해 알아보도록 하자.
ViewModelScope Lifecycle
viewModelScope는 ViewModel의 lifecycle과 연관되어 있다.
다르게 말하면 viewModelScope에서 시작된 코루틴은 ViewModel이 살아있는 경우 계속 실행된다.
당연히 ViewModel onCleared 메소드가 호출되는 시점에
viewModelScope에서 시작된 코루틴은 모두 cancel된다.
ViewModelScope 구현 살펴보기
이 스코프는 ViewModel이 clear될 때 자동으로 cancel된다는
위의 lifecycle 설명에서 말했던 부분이 보인다.
Dispatcher 확인하기
MainCoroutineDispatcher.immediate 라는 dispatcher가 보인다.
안드로이드에서는 Dispatchers.Main.immediate로 실행하게 된다.
이 dispatcher는 말 그대로 즉시 실행하도록 하는 dispatcher인데 코드와 함께 살펴보자.
viewModelScope.launch {
println("statement in the coroutine")
}
println("statement out of the coroutine")
위 코드를 실행하면 결과가 어떨까?
statement in the coroutine
statement out of the coroutine
결과는 위와 같다.
뭘 새삼스레 짚고 넘어가는 걸까 싶기도 하다.
하지만 여기서 viewModelScope의 dispatcher를 변경해서 실행해보자.
viewModelScope.launch(Dispatchers.Main) {
println("statement in the coroutine")
}
println("statement out of the coroutine")
이 결과는 아래와 같다.
statement out of the coroutine
statement in the coroutine
왜 이런 결과가 나올까?
그 차이는 immediate에 있다.
immediate를 사용하는 경우, 즉시 실행되지만 Dispatchers.Main을 통해 실행한 경우는
해당 실행문이 Runnable로써 Handler에 전달되어 실행된다.
따라서 실행 순서가 약간 밀리는 것이다.
남은 구현부 확인하기
이제 viewModelScope가 ViewModel의 확장함수로 선언되어 있는 것을 볼 수 있다.
그리고 CoroutineScope를 리턴하는데
이미 생성되어 있는 스코프가 있다면 그대로 리턴하고 없다면 생성해 리턴하게 된다.
스코프를 생성할 때 Dispatchers.Main.immediate와 SupervisorJob을 같이 할당한다.
먼저 dispatcher를 정하고 리턴할 때 SupervisorJob을 추가해 리턴해준다.
'Language > Kotlin' 카테고리의 다른 글
LifecycleScope 간단히 알아보기 (0) | 2025.02.26 |
---|---|
GlobalScope 알아보기 (0) | 2025.02.17 |
Structured Concurrency in Coroutines (1) | 2025.01.19 |
Coroutines 여러 개로 연산 속도 높이기 (1) | 2024.11.22 |
Java, Kotlin Interoperability 해결하기 (0) | 2024.11.18 |