πŸ‘©‍πŸ’» TECH

[TECH] Kotlin Coroutine을 μ¨μ•Όν•˜λŠ” 이유

보리 콧ꡬ멍 2023. 9. 22. 14:49

[ν‹°λŒ] ν‹°λŒ Android Kotlin Coroutine을 써야 ν•˜λŠ” μ΄μœ μ™€ μ‚¬μš©λ²•
 
μ•ˆλ…•ν•˜μ„Έμš” ν‹°ν”Œμ˜ μ•ˆλ“œλ‘œμ΄λ“œ 개발자 μ •μ±„ν˜„μž…λ‹ˆλ‹€πŸ˜†πŸ˜†πŸ˜†πŸ˜†

μ΄λ²ˆμ—λŠ” λ©€κ²Œλ§Œ λŠκ»΄μ§€κ³  처음 보면 μ–΄λ ΅κ²Œ λŠκ»΄μ§€λŠ” κ°œλ…μ„ 저도 μ •λ¦¬ν•˜λ©΄μ„œ ν™•μΈν•˜λŠ” μ‹œκ°„μ„ 가져보렀고 ν•©λ‹ˆλ‹€!

μ•ˆλ“œλ‘œμ΄λ“œλ₯Ό κ°œλ°œν•˜λŠ” μ‚¬λžŒμ΄λΌλ©΄ Coroutine을 듀어보셨을 거라 μƒκ°ν•©λ‹ˆλ‹€.

Coroutine은 무엇이고 비동기 μ²˜λ¦¬λŠ” 무엇인지 μ•Œμ•„λ³΄λŸ¬ κ°€λ΄…μ‹œλ‹€.πŸ’¨


πŸ‘©‍πŸ’» Coroutine? 코루틴이 뭐야?

코루틴을 μ••μΆ•ν•΄μ„œ μ„€λͺ…ν•˜μžλ©΄ μ‰¬μš΄ 비동기 처리둜 μ½”λ“œλ₯Ό 쉽고 가독성 λ†’κ²Œ μž‘μ„±ν•  수 μžˆλŠ” νŠΉμ§•μ„ κ°€μ§„ λ„κ΅¬μž…λ‹ˆλ‹€.

코루틴(Coroutines)은 Kotlinμ—μ„œ λ™μ‹œμ„±μ„ κ°„λ‹¨ν•˜κ²Œ μ²˜λ¦¬ν•  수 있게 ν•˜λŠ” κΈ°λŠ₯ 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.

코루틴은 비동기 μ½”λ“œλ₯Ό λ™κΈ°μ μœΌλ‘œ μž‘μ„±ν•˜λŠ” κ²ƒμ²˜λŸΌ 보이게 ν•˜μ—¬ μ½”λ“œμ˜ 가독성을 높이고, λ³΅μž‘ν•œ μ½œλ°±μ΄λ‚˜ λ‹€λ₯Έ λ™μ‹œμ„± νŒ¨ν„΄μ— λΉ„ν•΄ μ‰½κ²Œ μž‘μ„±ν•  수 있게 ν•©λ‹ˆλ‹€.

 

코루틴은 μœ„ν‚€ν”Όλ””μ•„μ—μ„œ μ•„λž˜μ™€ 같이 μ •μ˜ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

μ‹€ν–‰μ˜ μ§€μ—°κ³Ό 재개λ₯Ό ν—ˆμš©ν•¨μœΌλ‘œμ¨, λΉ„선점적 λ©€ν‹°νƒœμŠ€ν‚Ήμ„ μœ„ν•œ 
μ„œλΈŒ 루틴을 μΌλ°˜ν™”ν•œ 컴퓨터 ν”„λ‘œκ·Έλž¨ κ΅¬μ„±μš”μ†Œ


*비선점적 λ©€ν‹°νƒœμŠ€ν‚Ή

  • μ„ μ ν˜• : taskκ°€ cpuλ₯Ό μ‚¬μš©ν•˜κ³  μžˆλ”λΌλ„ 이걸 λΊμ–΄μ„œ μ€‘λ‹¨μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • λΉ„μ„ μ ν˜• : taskκ°€ cpu μ‚¬μš©κΆŒμ„ ν• λ‹Ήλ°›μ•˜μ„ λ•Œ μŠ€μΌ€μ€„λŸ¬κ°€ κ°•μ œλ‘œ cpuμ‚¬μš©κΆŒμ„ 뺏을 수 μ—†μŠ΅λ‹ˆλ‹€. 

코루틴은 병행성은 μ œκ³΅ν•˜μ§€λ§Œ, 병렬성은 μ œκ³΅ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

  • 병행성(Concurrency) : 물리적으둜 λ³‘λ ¬λ‘œ μž‘μ—…μ΄ μ‹€ν–‰λ˜λŠ” 것은 μ•„λ‹ˆμ§€λ§Œ κ·Έλ ‡κ²Œ λ³΄μ΄λŠ” 것 (λ…Όλ¦¬μ μœΌλ‘œ λ³‘λ ¬λ‘œ μž‘μ—…μ΄ μ‹€ν–‰λ˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄λŠ”  처리 = λ™μ‹œμ„±)
  • 병렬성(Parallelism) : 물리적으둜 λ³‘λ ¬λ‘œ μž‘μ—…μ΄ μ‹€ν–‰λ˜λŠ” 것 (μ‹€μ œλ‘œ λ™μ‹œμ— μž‘μ—…μ΄ 처리)

 


πŸ‘©‍πŸ’» 코루틴을 μ™œ 써야 ν•˜λŠ”λ°?

코루틴

Task1, Task2, Task3 이 μ™„λ£Œλ˜μ–΄μ•Ό μ‚¬μš©μžκ°€ 값을 보렀면 총 28μ΄ˆκ°€ 걸리게 λ©λ‹ˆλ‹€.(11+14+3 = 28) 
μ„œλ²„μ—μ„œ 큰 데이터λ₯Ό κ°€μ Έμ˜€λŠ” 경우λ₯Ό 생각해보면 μ‚¬μš©μ„±μ΄ ꡉμž₯히 λ–¨μ–΄μ§€κ²Œ 되겠죠?

λ„ˆλ¬΄ 많이 κΈ°λ‹€λ¦¬κ²Œ λœλ‹€λ©΄ μΌλΆ€ μ‚¬μš©μžλŠ” ν™”λ₯Ό λ‚΄λ©° 앱을 μ œκ±°ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€ 🀯

이 λͺ¨λ“  데이터λ₯Ό λ³‘λ ¬λ‘œ λ‹€μš΄λ‘œλ“œν•  수 μžˆλ‹€λ©΄ μ–΄λ–¨κΉŒμš”? μ΄ 14초면 데이터λ₯Ό μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ λΉ λ₯΄λ‹€κ³  λͺ¨λ“ κ²Œ 쒋은 건 μ•„λ‹™λ‹ˆλ‹€! 

κ΅¬μ‘°ν™”λ˜μ§€ μ•Šμ€ λ™μ‹œμ„±μ€ λͺ¨λ“  μž‘μ—…μ˜ μ™„λ£Œλ₯Ό 보μž₯ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ‹€μ œλ‘œ μƒμœ„ 코루틴이 μ™„λ£Œλœ 후에도 

ν•˜μœ„ 코루틴은 계속 싀행될 수 μžˆμŠ΅λ‹ˆλ‹€. 

이런 κ²½μš°λŠ” μ˜ˆμΈ‘ν•˜μ§€ λͺ»ν•œ κ°’ λ˜λŠ” 였λ₯˜κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 코루틴은 비동기 λΉŒλ”λ₯Ό μ‚¬μš©ν•˜κ³  λ°˜ν™˜κ°’μ— wait ν•¨μˆ˜ ν˜ΈμΆœμ„ μ‚¬μš©ν•˜λŠ” λ“±μ˜ λ°©μ‹μœΌλ‘œ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ„€λͺ…을 μœ„ν•΄ 코루틴에 λŒ€ν•œ 더 μžμ„Έν•œ λ‚΄μš©μœΌλ‘œ μ΄μ–΄κ°€κ² μŠ΅λ‹ˆλ‹€.


πŸ‘©‍πŸ’» 코루틴을 μ–΄λ–»κ²Œ μ‚¬μš©ν•˜μ§€?

μ˜μ‘΄μ„± μ£Όμž… build.gradle

coroutine_version = "1.6.0"
//coroutine
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutine_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutine_version"

μ½”λ£¨ν‹΄μ˜ μ£Όμš” μš”μ†Œ:

  1. suspend :  suspend fun으둜 μ„ μ–Έν•œ ν•¨μˆ˜λŠ” 코루틴 λ‚΄μ—μ„œλ§Œ 호좜될 수 μžˆμŠ΅λ‹ˆλ‹€. 이 ν•¨μˆ˜λŠ” 쀑간에 μΌμ‹œ 쀑지될 수 있고 λ‚˜μ€‘μ— λ‹€μ‹œ μ‹œμž‘λ  수 μžˆμŠ΅λ‹ˆλ‹€.
  2. launch: 코루틴을 μ‹œμž‘ν•˜κΈ° μœ„ν•œ ν•¨μˆ˜μž…λ‹ˆλ‹€. 주둜 비동기 μž‘μ—…μ— μ‚¬μš©λ©λ‹ˆλ‹€.
  3. async/await: 비동기 μž‘μ—…μ„ μ‹œμž‘ν•˜κ³  κ²°κ³Όλ₯Ό 기닀리기 μœ„ν•œ νŒ¨ν„΄μž…λ‹ˆλ‹€.
  4. runBlocking: 주둜 ν…ŒμŠ€νŠΈλ‚˜ 메인 ν•¨μˆ˜μ—μ„œ μ‚¬μš©λ˜λŠ” λΈ”λ‘œν‚Ή ν•¨μˆ˜μž…λ‹ˆλ‹€.

코루틴 Dispatchers:

코루틴은 νŠΉμ • CoroutineDispatcherμ—μ„œ μ‹€ν–‰λ©λ‹ˆλ‹€. μš©λ„μ— λ§žλŠ” Dispatcherλ₯Ό μ‚¬μš©ν•΄μ„œ μž‘μ—…ν•˜λ©΄ λ©λ‹ˆλ‹€.

  1. Dispatchers.Main: μ£Ό UI μŠ€λ ˆλ“œμ—μ„œ μž‘μ—…μ„ μ‹€ν–‰ν•˜κΈ° μœ„ν•œ λ””μŠ€νŒ¨μ²˜μž…λ‹ˆλ‹€. UI μ—…λ°μ΄νŠΈλ‚˜ μ• λ‹ˆλ©”μ΄μ…˜ λ“±μ˜ μž‘μ—…μ— μ ν•©ν•©λ‹ˆλ‹€. Androidμ—μ„œλŠ” Dispatchers.Main이 메인 μŠ€λ ˆλ“œμ— μ—°κ²°λ©λ‹ˆλ‹€. => UI μž‘μ—…
  2. Dispatchers.IO :μž…μΆœλ ₯ μž‘μ—…(λ„€νŠΈμ›Œν¬ 호좜, λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—… λ“±)에 μ΅œμ ν™”λœ λ””μŠ€νŒ¨μ²˜μž…λ‹ˆλ‹€. => λ„€νŠΈμ›Œν¬λ‚˜ λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…
  3. Dispatchers.Default: CPU 집쀑적인 μž‘μ—…μ— μ΅œμ ν™”λœ λ””μŠ€νŒ¨μ²˜μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 큰 리슀트의 μ •λ ¬μ΄λ‚˜ 계산 μž‘μ—… 등에 μ‚¬μš©λ©λ‹ˆλ‹€. => CPU 집쀑적인 μž‘μ—…
  4. Dispatchers.Unconfined: νŠΉμ • μŠ€λ ˆλ“œμ— μ’…μ†λ˜μ§€ μ•ŠλŠ” λ””μŠ€νŒ¨μ²˜μž…λ‹ˆλ‹€. 주둜 ν…ŒμŠ€νŠΈ μš©λ„λ‘œ μ‚¬μš©λ©λ‹ˆλ‹€. => ν…ŒμŠ€νŠΈ

ex. launchλ₯Ό μ‚¬μš©ν•˜μ—¬ 코루틴을 μ‹œμž‘ν•˜κ³ , Dispatchers.IOμ—μ„œ λ„€νŠΈμ›Œν¬μ—μ„œ 데이터λ₯Ό κ°€μ Έμ˜¨ ν›„, Dispatchers.Mainμ—μ„œ UIλ₯Ό μ—…λ°μ΄νŠΈν•˜λŠ” 경우

suspend fun fetchDataFromNetwork(): String { //suspend fun -> μ½”λ£¨ν‹΄λ‚΄μ—μ„œλ§Œ 호좜
    // λ„€νŠΈμ›Œν¬ λ˜λŠ” DB와 같은 비동기 μž‘μ—…μ„ κ°€μ •
    delay(1000)  // 비동기 μ§€μ—° ν•¨μˆ˜λ‘œ 1초 지연을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    return "데이터 λ°›μ•„μ˜€κΈ° μ™„λ£Œ"
}

fun updateUI(data: String) {
    println("UI μ—…λ°μ΄νŠΈ: $data")
}

fun main() {
    runBlocking {  // ν…ŒμŠ€νŠΈ 및 예제 λͺ©μ μœΌλ‘œ runBlocking μ‚¬μš©
        launch(Dispatchers.IO) {
            // IO μž‘μ—… μˆ˜ν–‰
            val data = fetchDataFromNetwork()

            withContext(Dispatchers.Main) {
                // UI μ—…λ°μ΄νŠΈ
                updateUI(data)
            }
        }
    }
}

 


πŸ‘©‍πŸ’» μ½”루틴 μ μš©ν•˜κΈ°

코루틴에 λŒ€ν•œ κΈ°λ³Έ 이해가 λ˜μ—ˆλ‹€λ©΄ μ‹€μ œλ‘œ 우리 μ½”λ“œμ—μ„œ 코루틴을 μž‘μ„±ν•˜κΈ° μœ„ν•΄ 더 μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

(λ‚΄μš©μ΄ κΉλ‹ˆλ‹€.. μ•„λž˜μ— μš”μ•½λ³Έ μžˆμŠ΅λ‹ˆλ‹€.)

  • withContext: 주둜 ν˜„μž¬ μ½”λ£¨ν‹΄μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μž„μ‹œλ‘œ λ³€κ²½ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.
  • CoroutineScope: μ½”λ£¨ν‹΄μ˜ 생λͺ… μ£ΌκΈ°λ₯Ό λͺ…μ‹œμ μœΌλ‘œ κ΄€λ¦¬ν•˜κ³  μ œμ–΄ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.
  • ViewModelScope: Android ViewModel에 λ‚΄μž₯된 μŠ€μ½”ν”„λ‘œ, ViewModel의 생λͺ… 주기에 μžλ™μœΌλ‘œ μ—°κ²°λ©λ‹ˆλ‹€.

기본적으둜 withContextλŠ” μž‘μ—…μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό λ³€κ²½ν•˜λŠ” 데, CoroutineScope와 ViewModelScopeλŠ” μ½”λ£¨ν‹΄μ˜ 생λͺ… μ£ΌκΈ°λ₯Ό κ΄€λ¦¬ν•˜λŠ” 데 μ΄ˆμ μ„ λ‘‘λ‹ˆλ‹€.

1. withContext

  • μ„€λͺ…: withContextλŠ” μ½”λ£¨ν‹΄μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό λ³€κ²½ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. 주둜 λ‹€λ₯Έ Dispatcher둜 코루틴을 μ΄λ™ν•˜μ—¬ μž‘μ—…μ„ μ‹€ν–‰ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
suspend fun fetchDataFromDatabase(): Data {
    return withContext(Dispatchers.IO) {
        // DBλ‘œλΆ€ν„° 데이터λ₯Ό κ°€μ Έμ˜΄
        database.getData()
    }
}

 

2. CoroutineScope

  • μ„€λͺ…: CoroutineScopeλŠ” μ½”λ£¨ν‹΄μ˜ 생λͺ… μ£ΌκΈ°λ₯Ό μ œμ–΄ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. νŠΉμ • μŠ€μ½”ν”„ λ‚΄μ—μ„œ μ‹œμž‘λœ 코루틴은 ν•΄λ‹Ή μŠ€μ½”ν”„μ˜ 생λͺ… 주기에 μ’…μ†λ©λ‹ˆλ‹€.
  • μ˜ˆμ‹œ: Activityλ‚˜ Fragment의 생λͺ… 주기와 μ½”λ£¨ν‹΄μ˜ 생λͺ… μ£ΌκΈ°λ₯Ό λ™κΈ°ν™”ν•˜κ³ μž ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
class MyActivity : AppCompatActivity(), CoroutineScope by CoroutineScope(Dispatchers.Main) {
    override fun onDestroy() {
        super.onDestroy()
        cancel() // λͺ¨λ“  코루틴 μ·¨μ†Œ
    }

    fun loadData() {
        launch {
            // 데이터 λ‘œλ”© 둜직
        }
    }
}

 

 

3. ViewModelScope

  • μ„€λͺ…: ViewModelScopeλŠ” Android의 ViewModelκ³Ό μ—°κ²°λœ 코루틴 μŠ€μ½”ν”„μž…λ‹ˆλ‹€. ViewModel이 클리어될 λ•Œ ν•΄λ‹Ή μŠ€μ½”ν”„ λ‚΄μ˜ λͺ¨λ“  코루틴도 μžλ™μœΌλ‘œ μ·¨μ†Œλ©λ‹ˆλ‹€. 이λ₯Ό 톡해 λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ‚˜ ν•„μš” μ—†λŠ” μž‘μ—…μ˜ 싀행을 λ°©μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ˜ˆμ‹œViewModel λ‚΄μ—μ„œ 데이터λ₯Ό λ‘œλ“œν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
  • kotlinCopy code class MyViewModel : ViewModel() { fun loadData() { viewModelScope.launch { // 데이터 λ‘œλ”© 둜직 } } }
class MyViewModel : ViewModel() {
    fun loadData() {
        viewModelScope.launch {
            // 데이터 λ‘œλ”© 둜직
        }
    }
}

 

async  await

async와 awaitλŠ” μ½”λ£¨ν‹΄μ—μ„œ 비동기 μž‘μ—…μ˜ κ²°κ³Όλ₯Ό κ°€μ Έμ˜€κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” νŒ¨ν„΄μž…λ‹ˆλ‹€. 주둜 μ—¬λŸ¬ 비동기 μž‘μ—…μ„ λ™μ‹œμ— μ‹œμž‘ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό λͺ¨μ•„μ„œ μ²˜λ¦¬ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

  • async: 이 ν•¨μˆ˜λŠ” 주둜 κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜λŠ” 비동기 μž‘μ—…μ„ μ‹œμž‘ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€. async둜 μ‹œμž‘λœ 코루틴은 Deferred 객체λ₯Ό λ°˜ν™˜ν•˜λ©°, 이 객체λ₯Ό 톡해 λ‚˜μ€‘μ— κ²°κ³Όλ₯Ό κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • await: Deferred κ°μ²΄μ—μ„œ μ‹€μ œ κ²°κ³Όλ₯Ό κ°€μ Έμ˜€κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. 이 ν•¨μˆ˜λŠ” ν•΄λ‹Ή 비동기 μž‘μ—…μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ ν˜„μž¬μ˜ 코루틴 싀행을 μΌμ‹œ μ€‘λ‹¨ν•©λ‹ˆλ‹€.

μ‚¬μš© 예:

suspend fun fetchData(): Deferred<String> = coroutineScope {
    async {
        delay(1000)  // 1초 λ™μ•ˆ μ§€μ—°
        "Data Fetched"
    }
}

suspend fun main() {
    val deferredData: Deferred<String> = fetchData()
    
    println("Doing some other work...")
    
    val data: String = deferredData.await() // μ—¬κΈ°μ—μ„œ 코루틴은 fetchData의 κ²°κ³Όλ₯Ό κΈ°λ‹€λ¦½λ‹ˆλ‹€.
    println(data)  // "Data Fetched"λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.
}

 

OnCleared

ViewModel λ‚΄λΆ€μ—μ„œ 코루틴을 μ‚¬μš©ν•  λ•Œ onClearedλ₯Ό μ˜€λ²„λΌμ΄λ“œν•΄μ•Ό ν•©λ‹ˆλ‹€.

  1. μžμ› ν•΄μ œ: ViewModel이 더 이상 ν•„μš”ν•˜μ§€ μ•Šμ„ λ•Œ, 즉 κ΄€λ ¨λœ UI μ»΄ν¬λ„ŒνŠΈ(예: μ•‘ν‹°λΉ„ν‹°λ‚˜ ν”„λž˜κ·Έλ¨ΌνŠΈ)κ°€ νŒŒκ΄΄λ˜μ—ˆμ„ λ•Œ onClearedλŠ” ν˜ΈμΆœλ©λ‹ˆλ‹€. μ΄λ•Œ μ‹€ν–‰ 쀑인 코루틴을 μ·¨μ†Œν•˜μ—¬ λΆˆν•„μš”ν•œ μž‘μ—…μ„ μ€‘λ‹¨ν•˜κ³  κ΄€λ ¨ μžμ›μ„ ν•΄μ œν•˜κΈ° μœ„ν•΄ onClearedλ₯Ό μ˜€λ²„λΌμ΄λ“œν•©λ‹ˆλ‹€.
  2. λ©”λͺ¨λ¦¬ λˆ„μˆ˜ λ°©μ§€: 코루틴이 계속 μ‹€ν–‰λ˜λ©΄μ„œ ViewModel이 파괴된 후에도 μ°Έμ‘°κ°€ μœ μ§€λ  경우 λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. 코루틴을 적절히 μ·¨μ†Œν•¨μœΌλ‘œμ¨ μ΄λŸ¬ν•œ λˆ„μˆ˜λ₯Ό λ°©μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ViewModelμ—μ„œ μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ ViewModelScopeλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

 

Structured Concurrency

코루틴은 Structured Concurrency, Unstructured Concurrency 두 κ°€μ§€λ‘œ 이루어져 μžˆμŠ΅λ‹ˆλ‹€.

κ·Έ 쀑 Unstructured Concurrencyλ₯Ό μ“°λ©΄ μ˜ˆμ™Έκ°€ μΌμ–΄λ‚˜λŠ” κ²½μš°κ°€ μžˆμ–΄ Structured Concurrencyλ₯Ό μ¨μ•Όν•©λ‹ˆλ‹€.이 λ¬Έμ œλŠ” CoroutineScopeλ₯Ό μ‚¬μš©ν•˜λ©΄ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Structured Concurrencyλ₯Ό μ‚¬μš©ν•˜λ©΄ 코루틴이 μžλ™μœΌλ‘œ μ·¨μ†Œλ˜μ–΄ μ˜ˆμ™Έ μ²˜λ¦¬κ°€ λ”μš± μ•ˆμ „ν•˜κ²Œ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€. CoroutineScopeλ₯Ό μ‚¬μš©ν•˜μ—¬ μ μ ˆν•œ CoroutineContextλ₯Ό μ„€μ •ν•˜κ³ , launchλ‚˜ asyncλ₯Ό μ‚¬μš©ν•˜μ—¬ 코루틴을 μ‹€ν–‰ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. Unstructured Concurrencyλ₯Ό μ‚¬μš©ν•˜λŠ” 경우 μ˜ˆμ™Έ 처리λ₯Ό μœ„ν•œ 좔가적인 μ½”λ“œκ°€ ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ— μ£Όμ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

 


πŸ‘©‍πŸ’» μ½”루틴 μš”μ•½!

직접 ν•œλ•€ ν•œλ•€ ν”Όκ·Έλ§ˆλ‘œ μš”μ•½ν•œ λ‚΄μš©μž…λ‹ˆλ‹€! 🫠

코루틴 μš”μ•½

 


πŸ‘©‍πŸ’» 마치며

이번 글은 이야기가 λ°©λŒ€ν•΄μ„œ λ°©μ „λ˜μ—ˆμŠ΅λ‹ˆλ‹€...πŸͺ«

μ—­μ‹œ 지식은 κΉŠμ–΄μ§ˆμˆ˜λ‘ μ–΄λ €μš΄ κ±° κ°™μŠ΅λ‹ˆλ‹€...! 

였늘 ν•˜λ£¨ λͺ¨λ‘ ν–‰λ³΅ν•œ μ‹œκ°„ λ³΄λ‚΄μ…¨μœΌλ©΄ μ’‹κ² μŠ΅λ‹ˆλ‹€ πŸ’›

 

λ‹€μŒ 글도 κΈ°λŒ€ λΆ€νƒλ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€:)πŸ€—

κ°μ‚¬ν•©λ‹ˆλ‹€!!

 

⬇️ μ§€κΈˆ ꡬ글 ν”Œλ ˆμ΄ μŠ€ν† μ–΄μ—μ„œ ν‹°λŒ λ‹€μš΄ λ°›κΈ°
https://play.google.com/store/apps/details?id=com.team7.tikkle&hl=ko-KR

πŸ“© Contact : wjdcogus6@gmail.com
πŸ“² SNS : https://www.instagram.com/chaeehyuny/