IMCAT.DEV
로그인 가입
Kotlin 고급 비동기

Kotlin 고급 코루틴 활용

Kotlin 고급 코루틴 활용 — 고급

고급 코루틴 활용

1. 도입 (왜 배워야 하는가)

Kotlin의 코루틴은 비동기 프로그래밍을 간단하게 만들어 주는 강력한 도구입니다. 실무에서는 사용자 경험을 최적화하기 위해, 특히 UI 응답성을 유지하며 네트워크 요청이나 데이터베이스 작업을 수행할 필요가 있습니다. 만약 코루틴을 제대로 활용하지 못한다면, 앱은 느려지거나 심지어 크래시가 발생할 수 있습니다. 예를 들어, 사용자가 버튼을 클릭했을 때 앱이 멈춘다면, 이는 사용자에게 큰 불편을 주고 결국 앱 사용을 포기하게 만들 수 있습니다.

2. 핵심 개념 설명

코루틴의 주요 개념은 다음과 같습니다:

2-1. 코루틴

코루틴은 경량 스레드로, 비동기 코드를 작성할 수 있게 해줍니다. 비유하자면, 요리사가 동시에 여러 요리를 준비할 수 있는 것과 같습니다. 각 요리는 별도의 작업이지만, 요리사는 동시에 여러 작업을 관리할 수 있습니다.

2-2. 디스패처

디스패처는 코루틴이 실행될 스레드를 결정합니다. 예를 들어, Dispatchers.Main은 UI 스레드에서 실행되도록, Dispatchers.IO는 입출력 작업을 위해 백그라운드 스레드에서 실행됩니다.

디스패처설명
Dispatchers.MainUI 스레드에서 실행
Dispatchers.IO입출력 작업을 위한 백그라운드 스레드
Dispatchers.DefaultCPU 집약적인 작업을 위한 스레드

3. 기본 코드 예제

가장 기본적인 코루틴 사용법을 알아보겠습니다.

import kotlinx.coroutines.*

fun main() = runBlocking {
    launch { // 새로운 코루틴 시작
        delay(1000L) // 1초 대기
        println("코루틴 실행 완료!") // 메시지 출력
    }
    println("메인 함수 실행 중...") // 즉시 출력
}

실행 결과

메인 함수 실행 중...
코루틴 실행 완료!

코드 한 줄씩 동작 설명

  • import kotlinx.coroutines.*: 코루틴 라이브러리를 가져옵니다.
  • fun main() = runBlocking { ... }: 메인 함수에서 블로킹 코루틴을 실행합니다.
  • launch { ... }: 새로운 코루틴을 시작합니다.
  • delay(1000L): 1초 동안 대기하지만, 다른 코루틴은 실행됩니다.
  • println("코루틴 실행 완료!"): 대기 후 메시지를 출력합니다.
  • println("메인 함수 실행 중..."): 메인 함수가 즉시 실행되며 출력됩니다.
  • 4. 실전 활용 예제

    4-1. 네트워크 요청

    쇼핑몰에서 상품 정보를 가져오는 예제입니다.

    import kotlinx.coroutines.*
    import java.net.URL
    
    fun main() = runBlocking {
        launch(Dispatchers.IO) { // IO 디스패처에서 실행
            val result = fetchProductData()
            println("상품 데이터: $result") // 상품 데이터 출력
        }
        println("상품 정보를 요청 중...") // 즉시 출력
    }
    
    suspend fun fetchProductData(): String {
        delay(1000L) // 네트워크 지연 시뮬레이션
        return "상품 A, 상품 B, 상품 C" // 가상의 상품 데이터 반환
    }

    4-2. 병렬 작업

    여러 개의 작업을 동시에 수행하는 예제입니다.

    import kotlinx.coroutines.*
    
    fun main() = runBlocking {
        val job1 = async { fetchDataFromApi1() }
        val job2 = async { fetchDataFromApi2() }
        
        println("API 요청 중...")
        val data1 = job1.await() // 첫 번째 API 데이터 대기
        val data2 = job2.await() // 두 번째 API 데이터 대기
        println("결과: $data1, $data2") // 결과 출력
    }
    
    suspend fun fetchDataFromApi1(): String {
        delay(500L)
        return "API1 데이터"
    }
    
    suspend fun fetchDataFromApi2(): String {
        delay(700L)
        return "API2 데이터"
    }

    5. 흔한 실수와 주의사항

    5-1. 코루틴 스코프를 잘못 사용하는 경우

    fun someFunction() {
        launch { // 잘못된 사용
            // 코루틴이 실행되지 않음
        }
    }

    올바른 사용:

    fun someFunction() = runBlocking {
        launch {
            // 정상적으로 코루틴 실행
        }
    }

    5-2. 메인 스레드에서 긴 작업 수행

    fun main() {
        Thread.sleep(1000L) // 메인 스레드 블로킹
    }

    올바른 사용:

    fun main() = runBlocking {
        delay(1000L) // 메인 스레드 비블로킹
    }

    6. 정리

  • 코루틴은 비동기 프로그래밍을 단순하게 만들어 줍니다.
  • 디스패처를 통해 다양한 스레드에서 작업을 수행할 수 있습니다.
  • 여러 작업을 병렬로 처리할 수 있는 기능을 제공합니다.
  • 코루틴 사용 시 스코프를 정확히 이해하고 사용하는 것이 중요합니다.

다음에 학습하면 좋은 주제는 "Flow와 Channel"입니다. 이들은 비동기 데이터스트림을 처리하는 데 유용한 도구입니다.