본문 바로가기
Kotlin

Kotlin의 suspend 키워드를 이용한 비동기 프로그래밍

by ByteBridge 2023. 10. 29.
반응형

Kotlin에서 suspend 키워드는 코루틴을 사용하여 비동기 프로그래밍을 할 때 사용합니다. suspend 함수는 코루틴 안에서 실행되며, 비동기 작업을 수행할 수 있게 해줍니다. 이 함수는 실행을 중단할 수 있고, 필요에 따라 나중에 다시 시작할 수 있습니다. 이런 특징 때문에 suspend 함수를 사용하면 메인 스레드를 차단하지 않으면서 비동기 작업을 간결하게 처리할 수 있습니다.

suspend 함수의 특징

  • suspend 함수는 코루틴 스코프 내에서만 호출할 수 있습니다.
  • suspend 함수 내부에서는 다른 suspend 함수를 호출할 수 있습니다.
  • suspend 함수는 비동기 작업을 수행할 때 유용하며, delay(), async(), await()와 같은 코루틴 빌더와 함께 사용됩니다.
  • suspend 함수는 CoroutineDispatcher를 통해 적절한 스레드에서 실행될 수 있습니다.

사용 예시: 주문, 결제 확인 및 배송 처리

아래 코드는 주문 정보를 확인하고, 결제 정보를 확인한 후 배송 처리를 하는 예제입니다. 배송이 완료된 후에는 예상 도착 시간과 적립 예정 포인트를 계산하여 출력합니다.

import kotlinx.coroutines.*

data class Order(val id: String, val amount: Double)
data class Payment(val orderId: String, val amount: Double, val status: String)
data class Shipment(val orderId: String, val estimatedArrival: String)
data class Reward(val points: Double)

suspend fun getOrder(orderId: String): Order {
    delay(1000)
    println("주문 정보를 가져왔습니다: $orderId")
    return Order(orderId, 1500.0)
}

suspend fun checkPayment(order: Order): Payment {
    delay(1000)
    println("결제 상태를 확인했습니다: ${order.id}")
    return Payment(order.id, order.amount, "완료")
}

suspend fun processShipping(payment: Payment): Shipment {
    delay(1000)
    println("배송 처리를 완료했습니다: ${payment.orderId}")
    return Shipment(payment.orderId, "2일 후")
}

suspend fun calculateReward(payment: Payment): Reward {
    delay(500)
    val points = payment.amount * 0.01 // 1% 적립
    return Reward(points)
}

fun main() = runBlocking {
    val orderId = "12345"
    val order = getOrder(orderId)
    val payment = checkPayment(order)

    if (payment.status == "완료") {
        val shipment = processShipping(payment)
        val reward = calculateReward(payment)
        println("주문이 성공적으로 처리되었습니다.")
        println("배송 예정일: ${shipment.estimatedArrival}")
        println("적립 예정 포인트: ${reward.points}점")
    } else {
        println("결제가 완료되지 않았습니다.")
    }
}

이 예제에서 getOrder(), checkPayment(), processShipping(), calculateReward() 함수는 모두 suspend 함수입니다. 비동기 작업을 처리하기 위해 delay() 함수를 사용했습니다. main() 함수에서는 runBlocking 코루틴 빌더를 사용하여 비동기 작업을 처리하면서도 메인 스레드를 차단하지 않습니다.

이 코드는 주문 ID가 "12345"인 주문을 처리하는 예시로, 주문 정보를 가져오고, 결제 상태를 확인한 후, 결제가 완료되었다면 배송 처리를 진행합니다. 배송 처리가 완료되면 예상 도착 시간과 적립 포인트를 출력합니다.

반응형