지금까지 모든 네트워크 통신 job을 모두 viewmodel 에서 처리해왔다. 그리고 viewModel 에서 처리할때 생명주기에 따른 이슈를 처리하지 않기 위해 그냥 viewModelScope 를 사용해왔다. 그런데 구글에서 오픈소스로 공개해 놓은 sunflower app 의 repository를 보니 fragment에서 lifecycleScope 를 사용하고 Job을 직접 제어하는 코드를 확인할 수 있었다.
이걸 보고 생각이 들었다. Job을 직접 제어하는 수고를 좀 하면 CoroutineScope(Dispacher.IO)를 이용해서 네트워크 통신 속도를 높일 수 있고 이를 통해 조금더 사용자 경험을 높일 수 있지 않을까?
CoroutineScope(Dispachers.IO)와 viewModelScope의 네트워크 통신 속도를 비교해보자.
(1) CoroutineScope(Dispachers.IO)
(2) viewModelScope
두 scope 의 속도를 비교하면 역시나 CoroutineScope(Dispachers.IO)이 더 빠르다는 것을 알 수 있다. 15.3KB 정도의 적은 데이터량에서도 10% 정도의 속도 차이가 발생하고 있다.
하지만 viewModelScope 에 관한 글에 나와있듯, 처리해줘야하는 귀찮은 일들이 많다는 것을 다시 깨닫고, CoroutineScope(Dispacher.IO)를 이용하면 네트워크 통신 속도는 높일 수 있겠지만, 동시에 잠재적인 memory leak 위험이 증가하는 트레이드 오프가 있음을 확인했다.
그럼 그냥 viewModelScope의 Dispacher 를 바꿀 수 있으면 되지 않을까? 맞다. 그러면 해결되는 문제였다.
class MainViewModel: ViewModel() {
fun fetchData() {
viewModelScope.launch(Dispatchers.IO) {
NetworkDAO.repository.getAirPollution()
}
}
}
당장 만들어놓은 앱의 코드를 바꾸러 가야겠다!