viewModelScope 계속 쓸까?

timothy jeong·2022년 3월 9일
0

Android 개발 기록

목록 보기
7/8
post-thumbnail

의문점

지금까지 모든 네트워크 통신 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% 정도의 속도 차이가 발생하고 있다.

Trade off

하지만 viewModelScope 에 관한 글에 나와있듯, 처리해줘야하는 귀찮은 일들이 많다는 것을 다시 깨닫고, CoroutineScope(Dispacher.IO)를 이용하면 네트워크 통신 속도는 높일 수 있겠지만, 동시에 잠재적인 memory leak 위험이 증가하는 트레이드 오프가 있음을 확인했다.

의외로 간단한 해결

그럼 그냥 viewModelScope의 Dispacher 를 바꿀 수 있으면 되지 않을까? 맞다. 그러면 해결되는 문제였다.

class MainViewModel: ViewModel() {

    fun fetchData() {
        viewModelScope.launch(Dispatchers.IO) {
            NetworkDAO.repository.getAirPollution()
        }
    }
}

당장 만들어놓은 앱의 코드를 바꾸러 가야겠다!

profile
개발자

0개의 댓글