본문 바로가기

Coroutine

👋Coroutine : 1. Coroutine이란

728x90
fun routine() {
    subRoutine()
}

fun subRoutine() {
    ....
}

Routine은 컴퓨터 프로그램의 일부이며 특정한 일을 실행하기 위한 일련의 명령입니다. 이러한 일련의 명령을 함수라고 합니다.

Sub Routine은 함수 내부에 함수가 존재하는 경우 내부에 존재하는 함수를 의미합니다.

 

즉 sub routine은 routine에 의해 순차적으로 수행되게 됩니다.

 

Coroutine이란

코루틴은 무엇일까? 위에서 확인했던 Routine과 Sub Routine은 순차적으로 수행되었지만 Coroutine은 함께 수행됩니다.

 

스레드는 선점형 멀티태스킹으로 실제로 멀티코어를 사용해 *병렬성을 가질 수 있지만 코루틴은 비선점형 멀티태스킹으로 CPU를 시간분할하여 사용하기 때문에 실제로는 병렬성을 가지진 못합니다.

단지 지연(suspend) 재시작(resume)을 반복하며 번갈아 수행되어 *동시성을 가집니다.

 

코루틴은 기존에 비동기 처리 시 Callback 구현, cancel 작업, Resource 관리 등을 해야하는 불편을 줄이고 비동기 처리를 간단하게 할 수 있도록 편의성을 제공하고 MainThread가 blocking 되는 상태를 관리할 수 있도록 도움을 줍니다.

 

안드로이드에선 ANR을 발생시킬 수 있는 긴 작업이 소요되는 작업인 예를들어  네트워크 통신 작업을 할 때 Main Thread에서 수행하지 못하도록 막고 있습니다.

 

그 결과 네트워크 통신 작업 시 Exception: NetworkOnMainThreadException 예외가 발생하게 됩니다.

이 문제를 해결하기 위해 Sub Thread에서 네트워크 통신 작업을 하도록 처리했다고 합시다.

 

하지만 안드로이드에선 UI를 업데이트하는 작업은 Main Thread에서만 수행해야 합니다.

 

그 결과 UI를 업데이트하는 작업을 Sub Thread에서 할 시 Exception: CalledFromWrongThreadException 예외가 발생합니다. 

이 문제를 해결하기 위해 Main Thread에서 UI 업데이트 작업을 하도록 Callback 형태로 처리했다고 합시다.

 

즉, 네트워크 통신 작업을 호출하고 Main Thread로 Callback을 주어 UI 업데이트 작업을 하도록 했습니다.

 

하지만 여기서 발생하는 문제점이 있습니다.

OutOfMemoryError가 발생하는 것을 방지하기 위해서 호출한 객체들을 사용 후에 필요없어지면 메모리를 위한 작업을 해줘야하고 이로인한 코드들을 추가해줘야 하고 Callback을 통해 구현하는 과정에서 Callback 지옥에 빠지는 문제가 발생합니다.

 

이 모든 것을 해결하기 위해서 탄생한 것이 코루틴 입니다.

 

*병렬성 : 실제로 동시에 여러 작업이 처리되는 것을 의미합니다.

*동시성 : 동시에 실행되는 것처럼 보이는 것을 의미합니다.