비동기 처리를 위해서 새로운 Thread 를 생성하거나 Rxjava 를 주로 활용했었는데요,
우연히 Coroutine 에 대해서 알게 되었고
이번 기회에 Coroutine 대해서 공부하면서
개인적으로 중요하다고 생각했던 포인트를 요약 정리하였습니다.
1. 코루틴 (Coroutine) 이란?
"코루틴은 간소화된 방법으로 비동기적인 실행이 가능하고,
단일 스레드에서 여러 코루틴을 실행 할 수 있습니다."
2. 단일 스레드에서 여러 코루틴 실행..?
코루틴의 특징 중에 하나로 그림을 통해서 확인해보니 이해가 쉬웠습니다.
두 개의 새로운 Thread 를 생성하고 비동기적인 실행 시켰다고 가정하면 아래와 같은 그림을 가집니다.
코루틴의 경우는 아래와 같이 하나의 쓰레드 안에 여러 코루틴을 비동기적인 실행 시킬 수 있는 특징을 가집니다.
3. 코루틴 스코프 (CoroutineScope)
코루틴을 사용하는데 있어 CoroutineScope 를 활용합니다.
CoroutineScope 의 인자로는 CoroutineContext 을 가지는데,
이를 통해 실행할 작업이 어떤 스레드에 배정할지 결정합니다.
private val coroutineScope = CoroutineScope(Dispatchers.Default)
private val coroutineScopeMain = CoroutineScope(Dispatchers.Main)
private val coroutineScopeIO = CoroutineScope(Dispatchers.IO)
- Dispatchers.Default : 복잡한 연산 작업에 사용
- Dispatchers.Main : UI 동작에 사용
- Dispatchers.IO : 파일 입출력에 사용
4. 코루틴 스코프 (CoroutineScope) 빌더
스레드를 배정하고 생성까지 했다면 이제 실행까지 시켜야 하는데요,
CoroutineScope 을 실행하는데 있어 제공되는 빌더들이 있습니다.
첫 번째 빌더로는 launch 가 있습니다.
배정된 스레드에서 비동기적으로 실행시켜 줍니다.
coroutineScope.launch {
var count = 0
while (true) {
delay(1000L)
Log.d("TEST", "coroutineScope : ${count++}, currentThread ID : ${Thread.currentThread().id}")
}
}
두 번째 빌더로는 async 가 있습니다.
배정된 스레드에서 비동기적으로 실행시키며 반환값을 가집니다.
await 를 통해 반환 값을 기다릴 수 있습니다.
coroutineScopeMain.launch {
val deferred = async {
delay(2000L)
"Completed"
}
binding.tvTitle.text = deferred.await()
}
await 사용 시 체크 할 점이 하나 있는데,
await 는 반환 값을 기다려야 된다는 특성 때문에 반드시 코루틴 내부 또는 suspend function 을 통해 호출되어야 합니다.
suspend function 통해 호출 시키는 부분은 바로 다음 내용에서 확인 가능합니다.
5. Suspend Function 활용
코루틴 사용에 있어서 suspend Function 이 아래와 같이 활용 할 수 있습니다.
- 일정시간 대기상태 만들기
private suspend fun pause(timeMillis: Long) {
delay(timeMillis)
}
coroutineScope.launch {
pause(5000L)
...
}
- 반환 값을 기다려야 할 때 : await
(suspend function 을 사용했을 때 조금 더 가독성이 좋아 보이네요.)
private suspend fun getCompletedText(): Deferred<String> {
return coroutineScope.async {
delay(2000L)
"Completed"
}
}
coroutineScopeMain.launch {
binding.btnStop.text = getCompletedText().await()
}
6. 끝으로..
개인적으로 코루틴에 대해 공부하면서 요약 정리를 해보았는데요.
좀 더 세부적인 내용은 공식 문서 또는 여러 블로그를 추가로 참조하시면 좋을 것 같습니다.
부족하지만 끝까지 읽어주셔서 감사합니다 :)
[Reference]
0 comments: