DoReMi

[Kotlin] Coroutine 본문

카테고리 없음

[Kotlin] Coroutine

도레미누 2023. 11. 5. 21:32

코루틴을 왜 쓰게 되었는가..?

웹, 앱 분야에서 비동기 처리의 핵심으로 RX programming을 사용했다. 하지만 구글이 안드로이드 공식 언어를 코틀린으로 변경한 이후로 비동기처리를 coroutine으로 바꾸었다.

코루틴을 사용하면 비동기처리를 쉽게 할 수 있기 때문에

Coroutine Scope

Coroutine Scope 선언 방식

CoroutineScope(Dispatchers.IO).launch {
	//code
}

이런식으로 View에서 lifecycleScope를 사용하면 View의 라이프사이클과 연계하여 사용할 수 있다.

//activity
lifecycleScope.launch(Dispatchers.IO) {
	//code
}

라이프사이클이 파괴되면 스코프는 취소 된다.

Dispatcher 활용

  • GlobalScope에 launch는 파라미터로 Dispatcher을 받을수있습니다.
  • Dispatcher는 CoroutineContext를 상속받아 어떤스레드를 이용해서 동작할 것인지 미리 정해주는 역할을 합니다.

ViewModel CoroutineScope

  • ViewModel 에 연결된 CoroutineScope - ViewModel에서만 사용가능
  • 즉, ViewModel이 사라지면 스코프도 취소 됨. (ViewModel 라이프사이클과 연관)
  • Main쓰레드 말고 다른 쓰레드에서 실행하고 싶다면???
    • withContext(Dispatchers.Default)

async와 await

  • async
    • 결과나 예외를 반환한다.
    • 실행결과는 Deferred<T>를 통해서 반환하며 await을 통해서 받을 수 있다.
    • 예시→ 네트워크 작업을 하는 스레드로 비동기 작업을 할건데 결과나 예외를 반환해주세요~ 라는 뜻
    • CoroutineScope(Dispatchers.IO).async { // 여기서 무언가 작업을... }
  • await
    • await는 작업이 완료될때까지 기다리도록 한다.
    • 예시→ await함수를 사용한 코드는 작업이 완료될 때까지 기다렸다가 textView~~가 작동한다.
    • CoroutineScope(Dispatchers.Main).launch { val html = CoroutineScope(Dispatchers.IO).async { getHtml() }.await() textView.text = html.toString() }

Coroutine Flow

밑에 조금 유용해보이는 블로그를 넣어둘게요! 이런 심오한 내용은 각자 공부하시죠!

Kotlin Coroutine Flow 총정리 part3 # launchIn

  • 살짝 블로그 내용을 조금 알려드리자면…
    • Flow
      • Coroutine의 비동기 스트림 API
    • Hot Stream vs Cold Stream
    • Flow Cancellation(취소)
      • whitTimeoutOrNull
      • flow cancellation 체크
    • 빌더
      • flowOf
      • asFlow
    • Operator(중간 연산자)
      • map
      • onEach
      • filter, filterNot
      • transform
      • take, takeWhile
      • drop, dropWhile
    • Terminal Operators
      • toList, toSet
      • first, single
      • reduce
      • fold
      • count
      • launchIn, onEach
    등등…..

코루틴은 언제 사용해야 할까??

  1. 네트워크 호출 : 안드로이드 앱에서 서버와 통신할 때, 코루틴은 네트워크 호출을 비동기적으로 처리하고 응답을 기다리는 동안 UI를 차단하지 않도록 도와줍니다.
  2. 데이터베이스 액세스 : 로컬 데이터베이스와 상호 작용할 때, 코루틴은 데이터베이스 액세스를 비동기적으로 처리하고 메인 스레드를 차단하지 않도록 도와줍니다.
  3. 긴 작업 : 앱에서 오랜 시간이 걸리는 작업을 수행해야 할 때, 예를 들어 이미지 다운로드, 파일 처리, 데이터 가공 등, 코루틴을 사용하여 메인 스레드를 차단하지 않고 작업을 수행할 수 있습니다.
  4. 병렬 작업 : 여러 개의 작업을 병렬로 실행하고 결과를 조합해야 할 때, 코루틴은 병렬성을 효과적으로 다루는데 도움이 됩니다.
  5. UI 업데이트 : 백그라운드 스레드에서 수행된 작업의 결과를 UI에 업데이트해야 할 때, 코루틴을 사용하여 안전하게 UI 업데이트를 수행할 수 있습니다.
  6. 연속된 비동기 작업 : 여러 비동기 작업을 순차적으로 실행하고 그 결과에 따라 다음 작업을 수행해야 할 때, 코루틴은 코드를 더 간결하고 가독성 좋게 작성할 수 있도록 도와줍니다.

코루틴을 사용할 때 주의 할 점

  • 메모리 누수
  • 예외 처리

Job 과 async의 차이

  • launch가 반환하는건 Job
  • async가 반환하는건 Deffered
  • Deffered는 Job을 상속한 클래스이기 때문에 launch대신 async를 사용해도 문제가 없다.