[coroutine] runBlocking

 

runBlocking은 일반적으로 코루틴이 아닌 코드에서 코루틴을 시작할 때 (예: main 함수, 테스트 코드 등) 사용한다.
하지만 이미 코루틴 환경이 구성되어 있는 경우 (suspend 함수 내부, Spring 코루틴 지원, CoroutineScope 내 등)에는 필요하지 않다.

 

코루틴은 코루틴 안에서만 suspend 함수를 호출할 수 있다.

withContext는 suspend 함수이다. 반드시 코루틴 안에서만 호출 가능하다. 그리고 suspend 함수 자체가 코루틴 안에서 실행된다는 뜻이기 때문에, 굳이 runBlocking을 쓸 필요가 없다.

 

suspend fun doSomething() {
    withContext(Dispatchers.IO) {
        println("IO 작업 중")
    }
}

이 doSomething() 함수는 suspend 함수다. 즉, 이 함수는 코루틴이 실행되고 있어야만 호출 가능하다.

 

렇다면 runBlocking은 언제 필요한가?

fun main() {
    // 일반 함수에서는 suspend 함수를 직접 호출할 수 없음
    doSomething() // 컴파일 오류

    // 그래서 runBlocking이 필요함
    runBlocking {
        doSomething() // 가능
    }
}

runBlocking은 "지금은 일반 함수지만, 이 안에서 코루틴을 시작하고 싶다"는 상황에서 코루틴 진입점 역할을 한다.