기록

[GPT가 알려주는] 코루틴과 Dispatchers 본문

잡동사니/GPT가 알려주는

[GPT가 알려주는] 코루틴과 Dispatchers

heylo 2025. 7. 31. 10:44

좋아요! 이제 **코루틴(Coroutines)**과 Dispatchers.IO, launch, withContext(Dispatchers.Main) 같은 키워드를 하나씩 차근차근 설명해 드릴게요. 쉽게 이해할 수 있도록 Thread와 비교하면서 설명하겠습니다.

 

 

1️⃣ 코루틴(Coroutine)이란?

  • Android에서 Thread 대신 사용할 수 있는 비동기 프로그래밍 도구
  • "가벼운 쓰레드"라고 생각하면 됨 → 수천 개도 부담 없이 실행 가능
  • Thread { ... }.start()처럼 직접 스레드를 만들 필요 없이 코드만 비동기/동기적으로 나눌 수 있음
  • Jetpack, Android 공식 권장 방식 (Thread보다 안전하고 코드 깔끔)

 

 

2️⃣ Dispatchers란? (작업할 스레드를 지정)

코루틴은 어디서(어떤 스레드에서) 작업할지 Dispatchers로 지정합니다.

🔹 종류

  1. Dispatchers.IO
    • 네트워크, DB, 파일 입출력 같은 무거운 I/O 작업 전용
    • Thread 풀에서 백그라운드로 실행
  2. Dispatchers.Main
    • UI(Main Thread) 전용
    • 화면 변경(LiveData 업데이트, View 변경 등)할 때 사용
  3. Dispatchers.Default
    • CPU 연산(데이터 처리, 알고리즘) 전용

 

 

 

3️⃣ launch란?

  • 코루틴을 실행하는 방법입니다.
  • Thread { ... }.start() 와 비슷하지만 훨씬 가볍습니다.
CoroutineScope(Dispatchers.IO).launch {
    // 이 안의 코드는 Dispatchers.IO (백그라운드 스레드)에서 실행됨
}

 

 

4️⃣ **withContext(Dispatchers.Main)**란?

  • 코루틴 실행 중 스레드를 전환할 때 사용
  • 예: 백그라운드에서 NTP 시간 가져온 뒤 → UI(Main Thread)로 넘어가서 ViewModel 업데이트
withContext(Dispatchers.Main) {
    // 이 안의 코드는 Main(UI) Thread에서 실행됨
}

 

 

5️⃣ 전체 흐름 이해하기 (UI + 비동기)

코루틴으로 syncSystemTimeWithNTP를 짜면 이런 구조가 됩니다:

CoroutineScope(Dispatchers.IO).launch { // 백그라운드 시작 (네트워크 작업)
    val ntpTime = fetchStandardTimeFromNTP() // NTP에서 시간 가져옴

    alarmManager.setTime(ntpTime) // 시스템 시간 설정

    withContext(Dispatchers.Main) { // UI 스레드로 전환
        viewModel.setSystemDate()   // 화면 업데이트
        viewModel.setSystemTime()
    }
}
  • launch : "코루틴을 시작한다"
  • Dispatchers.IO : "백그라운드에서 실행해라"
  • withContext(Dispatchers.Main) : "UI 스레드로 바꿔서 실행해라"

 

 

6️⃣ 왜 Thread 대신 코루틴을 써야 하나?

  1. 코드가 깔끔하다: Thread + Handler / runOnUiThread 섞을 필요 없음
  2. 메모리 효율: Thread보다 훨씬 가벼움
  3. Jetpack 지원: ViewModel + Coroutine 같이 쓰면 자동으로 메모리 누수 막아줌

❓ 정리하면

  • 코루틴 = 가벼운 비동기 프로그래밍 도구 (Thread 대체)
  • Dispatchers.IO: 백그라운드 (네트워크/DB)용
  • Dispatchers.Main: UI 변경용 (Main Thread)
  • launch: 코루틴 시작
  • withContext: 실행 도중 스레드 전환