안드로이드 개발을 하다보면 이 코루틴이라는 녀석을 자주보고 또 자주 사용하게 된다. 코루틴은 kotlin 에서만 사용하는것 같지만 실제로 파이썬, C#, Go, Javascript 등 여러 언어에서 지원하고 있다. Javascript 의 asynce await 와 같은 개념이라고 보면된다. 코루틴이란 쉽게 말해 동시성 프로그래밍의 개념을 Kotlin 에 적용한것이라고 보면된다. 우리는 일반적으로 "비동기 처리"를 할때 코루틴을 사용한다. 비동기 처리란건 뭘까 ?
우리들이 일반적으로 코드를 실행할때 , 작성한 코드가 순서대로 처리 되곤한다. 이러한 작업은 동기라고한다. 한번에 하나의 일만 실행되는 경우이다. 그렇다면 비동기란 여러개의 작업을 동시에 처리 하는 것을 말한다.
일반적으로 우리가 코드에서 이러한 비동기처리를 사용하는 곳은 대부분 코드에서 처리시간이 오래걸리는 작업이다. DB 에 데이터를 추가 삭제하는 작업이나 혹은 Rest API 를 통한 통신으로 응답이 올때까지 기다려야하는 작업의 경우 비동기처리를 하지않는다면 해당작업이 끝날때까지 하루종일 앱이 멈춰있게 된다. 이러한 문제점을 해결해주기 위해 coroutine 을 이용해 Main Thread 가 아닌 다른 Thread 에서 작업을 처리해주며 동시에 작업을 처리해주는 것이다.
자 이제 코루틴을 사용해보자
dependencies { implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9' }
우선 Gradle 에 추가를 해줘야한다 .
CouroutineScope.launch(Dispatchers.Main) {
//JOB
}
launch ?
launch 를 통해서 corountine 의 block 을 만든다. 현재 Thread 를 차단하지않고 새로운 coroutine 을 실행할 수 있다 !
GlobalScope 과 Coroutine Scope 의 차이는 Global 은 앱이 실행될 때 부터 종료될 때 까지 코루틴을 실행시키고 , Coroutine Scope를 Activity의 LifeCycle에 맞춰주면 Activity가 종료될 때 코루틴도 함께 종료되도록 만들 수 있다.
스레드의 종류에는 3가지가 있다.
Main : 메인 스레드, 화면 ui 작업 등을 하는 곳
IO : 네트워크, DB 등 백그라운드에서 필요한 작업을 하는 곳
Default : 정렬이나 무거운 계산 작업 등을 하는 곳
코루틴을 통해 다른 Thread 에서 작업을 실행하며 어플리케이션을 효율적으로 실행할 수 있다.
자 이제 각 Thread에 맞는 job 을 배치해주면 된다. suspend 함수를 활용하면 더욱 효율적으로 활용이 가능하다 .
suspend ?
suspend 함수란 "일시 중단 가능한 함수" 이다.
하나의 thread 가 block 될때 , 그 thread 는 다른 작업을 할 수 없다. 하지만 suspend 함수를 사용한다면 block 된 상태 인경우 해당 작업을 suspend 하고 그 동안 thread 에서 다른 작업을 사용할 수 있다 ! 따라서 하나의 thread 에서 여러개의 coroutine 을 실행 할 수 있는 것이다 .thread 자원을 아주 효율적으로 쓸 수 있는것이다.
자세한 내용은 안드로이드 공식문서를 참조하면 좋다 .
링크텍스트
완전 기초적인 내용만 써두었기 때문에 async , runblocking , coroutine context 등등 다루지 않은 것이 많다 . to be continue ...