코루틴을 알아보자

두리두두·2024년 7월 1일
0

Android

목록 보기
24/25
  • 개인프로젝트를 진행하며 가장 문제가 많았던 것이 데이터를 불러오는 시점이었다. 코루틴을 사용해서 비동기로~ 이런 말이 많았는데 정작 제대로 모르고 사용한 것 같아 파헤쳐보려한다.

https://developer.android.com/codelabs/basic-android-kotlin-training-introduction-coroutines?hl=ko#0
참고!

스레드

  • 코루틴을 알기 전 안드로이드 프로그램이 어떻게 실행되는지를 먼저 알아보자.

동시 작업의 경량화!

  • A,B 두 작업을 동시에 하려 할때 A가 끝날때까지 기다렸다가 B를 하는건 비효율적이다! 그래서 얘네 두개를 동시에 할 수 있게 해주는게 원래 쓰레드의 역할이다.

스레드 vs 코틀린

  1. 스레드
  • 여러개의 스레드를 사용하면 비동기 작업이 가능하나 스레드를 교체할 때마다 콘텍스트 스위칭이 발생한다.
  1. 코루틴
  • 코루틴은 단일 스레드에서 여러개의 오브젝트만 교체하며 순차적으로 작업을 수행한다. OS레벨의 콘텍스트 스위칭이 발생하지 않는다. => 코루틴이 경량 스레드라고 불리는 이유이다.

https://velog.io/@moonliam_/Android-%EC%BD%94%EB%A3%A8%ED%8B%B4Coroutine-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0

어떻게 쓰는가

  • Android Kotlin에서는 코루틴을 실행할 위치를 지정하는데 사용할 수 있는 세 가지 Dispatcher 를 제공한다. 어떤 스레드에서 코루틴을 실행할지 정하는 것!

Dispatchers

  1. Dispatchers.Main
  • 메인 스레드에서 실행, 주로 UI 업데이트 작업
  • suspend 함수 호출하고 Liva data 업데이트 등
  1. Dispatchers.IO
  • 다른 스레드(자동으로 생성해줌)에서 실행, 주로 네트워크 비동기 작업
  • room DB 업데이트 등
import kotlinx.coroutines.*
import java.net.URL

fun main() {
    // IO 디스패처를 사용하여 네트워크 요청을 비동기적으로 처리
    val job = GlobalScope.launch(Dispatchers.IO) {
        val result = fetchDataFromNetwork("https://jsonplaceholder.typicode.com/todos/1")
        println("Result from network: $result")
    }

    // 메인 스레드는 여기서 다른 작업을 수행할 수 있음

    // job을 기다림
    runBlocking {
        job.join()
    }
}

suspend fun fetchDataFromNetwork(urlString: String): String {
    return URL(urlString).readText()
}

=> 이러한 IO 코루틴의 장점은 다음과 같다.

[1] 스레드 관리

  • 개발자가 직접 스레드를 만들지 않아도 됨

[2] 자원 효율성

  • 필요한 만큼만 스레드 생성 가능

[3] 병렬 처리

  • 비동기 작업 가능
  1. Dispatchers.Default
  • 일반적으로 CPU 많이 차지하는 작업 실행할때 사용.

프로젝트에서 몰랐던 것

  • 뷰모델-프래그먼트 조합으로 데이터를 불러올 때, 데이터 로딩 시점과 UI 그리는 시점이 맞지 않아서 ANR이 나 앱이 꺼졌던 경험이 많았다.
  • 비동기 작업에 대한 고려 없이 만들어서 아래와 같은 문제에 직면하였다,,(출처 챗지피티)
  1. 비동기 작업 처리: ViewModel 내에서 비동기 작업(예: 네트워크 요청, 데이터베이스 액세스)을 수행하는 경우, 이 작업을 메인 스레드에서 동기적으로 실행하면 UI 스레드가 차단될 수 있습니다. 이로 인해 ANR(Application Not Responding)이 발생할 수 있습니다.

  2. 데이터 로드 순서: ViewModel에서 데이터를 비동기적으로 로드할 때, 이 작업이 UI 스레드에서 실행되어야 할 UI 업데이트 작업보다 먼저 완료될 경우 문제가 발생할 수 있습니다. 예를 들어, UI가 데이터를 기대하는 상태에서 데이터가 아직 로드되지 않은 경우 UI가 올바르게 표시되지 않을 수 있습니다.

  3. 레이스 컨디션(Race Condition): 비동기적으로 데이터를 처리하지 않으면, 동시에 여러 요청이 발생할 때 데이터의 상태가 일관성 없이 변경될 수 있습니다. 예를 들어, 두 개 이상의 요청이 동시에 데이터를 수정하려고 할 때, 예상하지 못한 결과가 발생할 수 있습니다.

  4. UI 업데이트 문제: 데이터 로딩이 완료된 후에 UI를 업데이트해야 할 때, 비동기 작업을 사용하지 않으면 데이터가 준비되기 전에 UI를 업데이트하려고 시도할 수 있습니다. 이로 인해 UI가 부정확하게 표시될 수 있습니다.

  • 일정을 작성하고 확인 눌렀을 때 바로 캘린더에 업뎃되게
  • 수정하고 나왔을 때 바로 업뎃되게

  • 전체적으로 운영체제에 대한 이해가 부족하여 지금 이해가 느린것같다 omg

https://velog.io/@haero_kim/Thread-vs-Coroutine-%EB%B9%84%EA%B5%90%ED%95%B4%EB%B3%B4%EA%B8%B0

profile
야금야금 앱 개발자

0개의 댓글