Posts [Coroutine] 결과를 반환받는 async & await
Post
Cancel

[Coroutine] 결과를 반환받는 async & await

Async

이전글에서 코루틴 상태 관리를 공부하며 async는 결과도 반환 받을 수 있도록 언급했던 적이 있다.

async는 결과를 반환하며 결과값은 Deferred로 감싸서 반환되게 된다.
결과값은 await() 함수를 통해 접근할 수 있다.

기억하자.
launch는 Job을 반환하며 이를 통해 상태 관리를 할 수 있다.
async는 Deferred를 반환하며 이를 통해 상태 관리와 결과값에 접근할 수 있다.





바로 사용해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import androidx.databinding.DataBindingUtil
import com.study.taehyungk.databinding.ActivityMainBinding
import kotlinx.coroutines.*

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        binding.run {
            lifecycleOwner = this@MainActivity
        }

        Log.d(TAG, "onCreate: ")
        CoroutineScope(Dispatchers.Default).launch {
            val networkingDeferred = async(Dispatchers.IO) {
                delay(3000)
                "some networking.."
            }

            val dbDeferred = async(Dispatchers.IO) {
                delay(5000)
                "some db.."
            }

            Log.d(TAG, "${networkingDeferred.await()} | ${dbDeferred.await()}")
        }
    }
    
    companion object {
        private const val TAG = "MainActivity"
    }
}

아래 결과를 보면 await() 메소드를 통해 결과값(예제에선 문자열)을 반환 받아 로그로 노출하는 것을 볼 수 있다.
또한, onCreate ~ 결과값을 노출하는 로그 까지 걸리는 시간을 보면 5초가 걸린 것을 볼 수 있다.

즉, 시간이 걸리는 작업들이 여러개 있을 때 모든 작업이 완료가 되어야 await()가 위치한 코드가 동작한다는 것을 알 수 있다.

2021-10-10 02:22:49.957 D/MainActivity: onCreate: 
2021-10-10 02:22:54.992 D/MainActivity: some networking.. | some db..

주의할 점

await() 함수가 실행되면 코루틴은 결과가 반환될 때까지 기다리게 된다.
이를 일시 중단(suspend) 되었다고 하며 이러한 특성으로 인해 await() 메소드는 일시 중단이 가능한 코루틴 내부에서만 사용이 가능하다.

그렇기 때문에 await() 는 코루틴 내부 혹은 suspend 함수 내에서만 사용이 가능하다.

스크린샷 2021-10-10 오전 2.44.49.png

글을 마치며

오늘은 async에 대해 알아보았다. async의 핵심은 결과 값 반환이다.

async는 내가 실제로 코루틴의 매력을 처음으로 느끼게 해준 메소드이다.(정확하게는 코루틴 자체의 코드 간결성(?) 때문이긴 하지만..🥸)
서버 데이터와 안드로이드 내부 DB의 값 간에 싱크를 맞추는 작업에서 RxJava가 더 편해서 RxJava를 사용했었는데 너무 복잡해서 코루틴을 쓰니 굉장히 심플한 코드로 작업할 수 있었던 경험이 있다.
async 를 공부하다가 갑자기 왜 나의 경험기까지 적는지는 모르겠지만..

아무튼 아직까지 코루틴의 channel(?)이라던가 flow(?)라던가 하는 것들을 다루어보지 않아서 그런지 RxJava에 비해 확실히 러닝커브가 낮은 것 같은데 이러한 어려운 개념들까지도 잘 습득해서 코루틴을 능수능란하게 사용할 수 있는 고수가 되고싶다. 그때까지 화이팅..! 💪

참고 사이트
This post is licensed under CC BY 4.0 by the author.

[Coroutine] CoroutineScope와 Dispatchers, 코루틴의 상태 관리

[Compose] Jetpack Compose 맛보기

Comments powered by Disqus.