본문 바로가기
Kotlin

[Kotlin] Coroutine Suspend function

by LoseyKim 2024. 3. 25.

사용자 경험을 개선하고, 애플리케이션의 성능을 최적화하기 위해서는, 네트워크 요청, 데이터베이스 작업, 파일 I/O 등의 작업을 비동기적으로 처리해야 해요. Kotlin에서 비동기 프로그래밍을 지원하기 위해 suspend 함수와 코루틴을 제공해요. 오늘은 Kotlin의 suspend 함수가 무엇이고, 어떻게 사용되는지, 그리고 이를 사용함으로써 얻을 수 있는 장점에 대해서 알아볼게요.


Kotlin의 Suspend 함수란?

Kotlin에서 suspend 키워드가 붙은 함수는 코루틴 내에서 실행되며, 실행을 중단(suspend)하고 재개(resume)할 수 있는 "중단점(suspension point)"을 가져요. 이 중단점을 통해, suspend 함수는 실행 중에 다른 코루틴으로 제어를 양보할 수 있고, 비동기 작업이 완료되면 실행을 다시 재개할 수 있어요. 이런 특성 덕분에, suspend 함수는 네트워크 호출, 데이터베이스 액세스와 같은 비동기 작업을 쉽게 처리할 수 있어요.


작동 원리

  • 중단과 재개: suspend 함수는 실행 중에 특정 조건에서 호출 스레드를 차단하지 않고 실행을 중단해요. 대기가 끝나면 코루틴 스케줄러가 함수 실행을 다시 재개해요. 이 과정은 코루틴 컨텍스트에 의해 관리돼요.
  • 비동기성: 비차단 방식으로 이루어지므로, 주 스레드가 멈추지 않고 다른 작업을 계속 처리할 수 있어요.
  • 컨텍스트 전환: suspend 함수는 컨텍스트 전환의 오버헤드 없이 코루틴 간에 작업을 전환할 수 있어요. 이는 특히 I/O 작업이나 네트워크 호출 같이 대기 시간이 긴 작업을 처리할 때 유용해요.

사용 방법

  • 코루틴 빌더 사용: launch, async 등의 코루틴 빌더를 사용하여 코루틴을 시작해요. 이러한 빌더는 코루틴의 실행 컨텍스트를 제공하며, 이 안에서 suspend 함수를 호출할 수 있어요.
  • suspend 함수 호출: 코루틴 빌더 내부나 다른 suspend 함수 내부에서 suspend 함수를 호출해요. 이를 통해 비동기 작업을 쉽게 연결하고 구성할 수 있어요.

예제 코드

import kotlinx.coroutines.*

// Suspend 함수 정의
suspend fun fetchUserData(): UserData {
    // 1초 동안 일시 중단 (실제로는 네트워크 요청, 파일 입출력 등의 비동기 작업을 수행할 수 있음)
    delay(1000)
    return UserData("Losey Kim", "losey@example.com")
}

fun main() = coroutineScope {
    // fetchUserData() 함수는 suspend 함수이므로 코루틴 내부에서 호출해야 함
    val userData = fetchUserData()
    println(userData)
}

이 예제에서 fetchUserData 함수는 비동기적으로 사용자 데이터를 가져오고, runBlocking 블록 안에서 이 함수를 호출하여 결과를 출력해요. 이 방식으로, suspend 함수는 복잡한 비동기 로직을 간단하고 직관적인 코드로 작성할 수 있게 해 줘요.


suspend 함수의 이점

  • 비차단 I/O: suspend 함수는 I/O 작업을 비차단 방식으로 처리할 수 있게 해 줘요. 이는 애플리케이션의 리소스 활용도를 최적화하고, 동시에 많은 요청을 효율적으로 처리할 수 있게 해요.
  • 코드 가독성: 비동기 코드를 마치 동기 코드처럼 쓸 수 있게 해 줘요. 이는 비동기 로직을 이해하고 유지보수하는 데 큰 이점을 제공해요.
  • 오류 처리: suspend 함수를 사용하면, 전통적인 콜백 방식의 비동기 코드에서 발생하는 오류 처리의 복잡성을 줄일 수 있어요. try/catch 블록을 사용하여 비동기 코드에서 발생할 수 있는 예외를 쉽게 처리할 수 있어요.

참고자료

https://kotlinlang.org/docs/coroutines-basics.html#extract-function-refactoring

Coroutines basics | Kotlin

kotlinlang.org

https://kotlinlang.org/docs/composing-suspending-functions.html

Composing suspending functions | Kotlin

kotlinlang.org