brunch

You can make anything
by writing

C.S.Lewis

by 서준수 Aug 18. 2023

코루틴(Coroutine) 생성 및 실행

코틀린 코루틴 (1)

코루틴(Coroutine) 생성 및 실행


코루틴은 특정한 스레드에 종속되지 않고 일시정지를 통해 동시성을 제공한다.

스레드? 일시정지? 동시성? 이런 개념들은 잠시 내려놓고 천천히 하나씩 코루틴의 개념을 쌓아가보자.

이번 글에서는 가볍게 코루틴 관련 용어와 간단한 개념을 훑어보는 정도로 생각하면 된다.


코루틴을 사용하려면 먼저 의존성을 추가해야 한다. build.gradle.kts에 아래와 같이 추가하면 된다.

(참고) IntelliJ IDEA 2023.02, kotlin version 1.9.0, coroutine version 1.7.3

implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")


일단 밑도 끝도 없이 코드부터 실행해 보자.


Hello, World를 출력하는 간단한 코드이다. 그런데 조금 이상한 것이 있다. runBlocking은 뭐지?

runBlocking : 새로운 코루틴을 실행한다. 해당 코루틴이 완료될 때까지 현재 스레드를 차단(blocking)한다. 주로 main() 함수 또는 테스트에서 사용한다.

솔직히 무슨 말인지 와닿지 않을 것이라 생각한다. 위 코드를 인텔리제이에 옮겨보면 runBlocking 블록 내 수신 객체CoroutineScope라는 것을 알 수 있다.



CoroutineScope는 또 뭔가? 말 그대로 코루틴의 범위이다. 형태는 CoroutineContext를 프로퍼티로 가지고 있는 인터페이스이다. CoroutineContext는 코루틴 실행에 필요한 정보를 가진 객체이다. 지금은 그냥 그렇구나 하고 넘어가면 된다.


runBlocking의 블록 내부는 이제 새롭게 만들어진 코루틴이자 코루틴의 범위이다. 코루틴이 뭐라고 했나? 특정한 스레드에 종속되지 않고 일시정지를 통해 동시성을 제공한다고 했다. runBlocking은 코루틴이 완료될 때까지 현재 스레드를 차단한다고 했다. 스레드를 차단한다는 말도 정확히 어떤 의미인지 와닿지 않을 수 있다. 이 말은 runBlocking 블록 내부의 모든 작업이 실행될 때까지 스레드를 차지하는 것으로 생각하면 된다. 두 개념을 살짝 조합하면 일단 runBlocking이 잡아둔 스레드에서 코루틴이 실행되고 있다는 것이다. (이것도 무슨 말인지 지금 몰라도 된다.)

이해를 돕기 위해 우스꽝스러운 그림을 위와 같이 그려보았다. (그리고 '주술회전'이라는 만화를 봤다면 더욱 이해에 도움이 될) 우스꽝스러운 이야기도 하나 준비했다.


runBlocking은 스레드라는 세상에서 CoroutineScope이라는 자신만의 영역을 전개한다. 그리고 코루틴이라는 하나의 술식을 발동시킨다. runBlocking은 자신이 만든 CoroutineScope 영역 내에서 발동한 코루틴이 제대로 완료될 때까지 스레드라는 세상이 파괴되지 않도록 꽉 붙잡아 컨트롤한다. 세상이 파괴되면 자신이 만든 영역도 파괴될 것이고 발동한 술식이 완료될 수 없다. 술식이 완료되기 전에 세상이 망했으니까!


runBlocking은 결국 CoroutineScope을 생성하고 자신이 할 작업이 완료될 때까지 스레드를 차지하는 특수 능력을 가진 녀석이다. 이렇게 CoroutineScope을 전개하여 코루틴을 만드는 함수를 Coroutine Builder라고 한다.


또 새로운 용어가 등장했다. Coroutine Builder는 뭔가? 그건 다음 편에서 알아보자.


요약해 보자. 이 요약의 내용들은 갈수록 점점 더 살이 붙게 될 것이다.

- runBlocking은 CoroutineScope을 생성하는 가장 기본적인 Coroutine Builder이며, 스레드를 차단(blocking)하고 코루틴을 실행한다.
- CoroutineScope는 코루틴 실행을 관리하는 인터페이스이며 코루틴 실행에 필요한 정보를 가진 CoroutineContext 객체를 가진다.
- 코루틴은 CoroutineScope 내에서 생성되고 실행된다.
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari