이번 프로젝트를 진행하면서 비동기처리를 위해 coroutine을 사용했다.
지금까지 coroutine을 사용하면서 코루틴 빌더중에 launch를 계속해서 사용했지만,
이번 프로젝트를 진행하면서 병렬처리를 통해서 속도 개선을 하고 네트워크 작업이 완료 된 후 진행되어야 하는 작업의 타이밍을 맞추기 위해서 async를 사용해보고 해당 내용을 정리해보려고 한다.
코루틴을 시작하는 코루틴빌더의 한 종류로 launch와 다르게 Deferred객체를 결과로 반환 받는다.
async를 사용하면 여러 비동기 작업을 동시에 수행할 수 있어 코드의 효율이 향상된다.
기본적으로 async에서 시작된 코루틴이 완료될때까지 다음 코드로 진행을 막아주는 역할을 한다.
내가 직접 이번 프로젝트에서 사용한 코드를 예시로 가져왔다.
viewModelScope.launch {
// async 함수를 통해서 날씨와 미세먼지 데이터를 받아오는 비동기 작업을 시작
val weatherDeferred = async { getWeatherInfo() }
val dustDeferred = async { getDustInfo() }
// 각각의 반환 결과를 list로 만듦
val list = mutableListOf(weatherDeferred, dustDeferred)
list.awaitAll()
// list에 있는 비동기 작업이 끝난 뒤 아래 코드를 실행
setWeatherPreview()
}
항상 launch만 써서 코루틴을 사용하다가 이번에 async와 await을 통해 비동기 작업을 병렬로 처리해보면서 코루틴에 대해 좀 더 알게 된거같다는 생각이든다 아직 많이 부족하겠지만..