Android에서 네트워크 동작 같은 시간이 오래걸리는 비동기 작업을 처리할 때, 코루틴을 사용하지 않을 때는 보통 쓰레드(Thread)를 새로 생성하거나 콜백(callback)을 이용해서 처리하였다.
하지만 이런 방식은 코드의 복잡도가 높아질수록 예외 처리 및 콜백 지옥(callback hell) 문제에 봉착하게 되고 특히 콜백 지옥은 코틀린 이전 자바 개발자들에게는 숙명과도 같은 존재였다.
하지만 Kotlin 1.3 버전부터 Android에서 비동기 실행 코드를 간소화하기 위한 설계 패턴이 추가되었고 이것이 바로 코루틴(Coroutine)이다.
코루틴이란 Android에서 비동기 프로그래밍을 위해 탄생한 일종의 경량 스레드라고 볼 수 있다.
경량 스레드란 표현에서 알 수 있듯이 코루틴은 단일 스레드에서 여러개를 실행할 수 있기 때문에 컨텍스트 스위칭(Context Swtiching)으로 인한 오버헤드가 적다는 것이 큰 장점이다.
쓰레드(Thread)와 코루틴(Coroutine) 모두 Concurrency 동시성을 보장하기 위한 기술이다.
하지만 Thread
는 여러개의 작업을 동시에 수행할 때 메모리를 할당해주지만 Coroutine
은 각 작업에 쓰레드와 메모리를 할당하는 것이 아닌 작은 Object만을 할당해주고 이를 스위칭함으로써 오버헤드를 줄인다.
위 이미지와 같이 Thread
로 비동기 작업을 처리할 때 각 Thread
가 서로 필요할 때 호출하고 메모리 영역을 전환하면서 Context Switching
이 일어난다.
반면에 Coroutine
은 단일 쓰레드 내에서 동작하기 때문에 각 작업 간 전환(Switching)이 발생할 때, Coroutine Object 객체들만 교체해주므로 OS 레벨의 Context Switching은 필요 없다.
이게 Coroutine
을 경량 쓰레드(Lightweight Thread)라고 부르는 이유다.
코루틴은 Suspend
키워드를 통해 기존의 콜백 지옥에서 벗어나 비동기 코드를 순차적인 코드로 작성할 수 있게 해준다.
먼저 Blocking
과 Suspending
의 차이점을 이해해보자.
단일 쓰레드에서 네트워크 요청(Function A)과 같은 수행시간이 오래걸리는 작업을 수행하면 답을 얻는데 긴 시간이 필요할 수 있다. 이때 해당 쓰레드는 블록상태(Blocked)가 되고 다음 작업(Function B)는 네트워크 요청(Function A)가 끝날 때까지 기다리게 된다.
Android 메인 쓰레드(UI 쓰레드)에서 위와 같이 구현하면 ANR과 같은 에러를 발생시킬 확률이 높기 때문에 일반적으로 다중 쓰레드를 활용하여 비동기로 작업을 수행한다.
반면, 네트워크 요청(Function A)를 suspend
함수로 구현하면 쓰레드가 블록되는 대신 하던 작업을 정지(suspended) 시킨다. 그리고 다른 작업(Function B)가 쓰레드를 사용할 수 있도록 한다.
이처럼 코루틴이 단일 쓰레드 내에서 여러 작업을 수행할 수 있게 하는 개념이 바로 Suspend
이다.
// 쓰레드(Thread)를 이용한 처리
Thread {
val user = fetchUserData()
textView.text = user.name
}
// 콜백을 이용한 처리
fetchUserData { user ->
textView.text = user.name
}
// 코틀린 코루틴을 이용한 처리 (suspend 키워드 활용)
suspend fun loadUser() {
val user = api.fetchUser()
show(user)
}
위와 같이 네트워크를 통해 사용자 데이터(User Data)를 가져온 후 UI에 적용하는 코드를 구현할 때, suspend
함수를 활용한다면 비동기 작업을 마치 순차 코드(sequential code)를 작성하듯이 짤 수 있기 때문에 코드 복잡도가 감소하고 가독성이 매우 올라가는 효과를 볼 수 있다.
코루틴(Coroutine)의 탄생 배경과 장점에 대해서 알아보았으니 다음 포스트에서는 코루틴의 구조와 예시를 알아보도록 하자.
레퍼런스)
1. Android의 Kotlin 코루틴
2. 안드로이드 코루틴의 개념과 사용방법
3. 처음 시작하는 코루틴, 기본적인 용어와 이해
4. Coroutine, Thread와의 차이와 그 특징