본문 바로가기

Frontend/Kotlin

Coroutine 개념

코루틴이란?

실행의 지연과 재개를 허용함으로써 비선점적 멀티태스킹을 위한 서브 루틴을 일반화한 컴퓨터 프로그램 구성요소이다. 즉 코루틴은 메인이 되는 루틴과 별도로 진행이 가능한 루틴으로 개발자가 루틴의 실행과 종료를 마음대로 제어할 수 있는 단위이다.

 

 코루틴 Scope

  • Global Scope : 프로그램 어디서나 제어, 동작이 가능한 기본 범위이다.
  • Coroutine Scope: 특정한 목적의 dispatcher를 지정하여 제어 및 동작이 가능한 범위이다.

 

Dispatcher란?

코루틴에 대해서 공부하던 중 디스패처에 대한 내용이 나와 궁금하여 관련 블로그를 찾던 중 이해하는데 도움이 되는 그림을 그려서 가져왔다.

디스패처는 스레드에 코루틴을 보낸다라는 뜻이다. 코루틴을 디스패처에 전송하면 디스패처는 자신이 관리하는 스레드풀 내의 스레드의 부하상황에 맞춰 코루틴을 배분한다.

그림을 설명하자면,

1번 과정은 유저가 코루틴을 생성한 후 디스패처에게 전송한다.

2번 과정은 디스패처는 스레드 풀에서 자원이 남는 스레드가 어떤 스레드인지 확인한 후 해당 스레드에 코루틴을 전송한다. 코루틴은 만들어진 스레드 풀을 직접 제어하지 않고 디스패처를 통해 제어한다.

즉 스레드 풀을 직접 만들 수는 있지만 스레드 풀 제어는 모두 디스패처에게 맡긴다. 우리가 디스패처에게 코루틴을 보내기만 하면 디스패처는 스레드에 코루틴을 분산시킨다.

 

안드로이드 제공 Dispatcher

  • Dispatchers.Main :Android 메인 스레드에서 코루틴을 실행하는 디스패처, 디스패처는 Ui와 상호작용하는 작업을 실행하기 위해서만 사용
  • Dispatchers.IO :디스크 또는 네트워크 I/O 작업을 실행하는데 최적화되어 있는 디스패처
  • Dispatchers.Default :CPU를 많이 사용하는 작업을 기본 스레드 외부에서 실행하도록 최적화되어 있는 디스패처. 정렬 작업이나 JSON 파싱 작업등에 최적화

코루틴 생성 함수

  • launch :  반환값이 없는 job객체
  • async :  반환값이 있는 deffered 객체

이 두 함수의 차이점은 코루틴에서의 반환값이 있는지 여부이다. 

 

추가 함수들

  • delay : milisecond 단위로 루틴을 잠시 대기시키는 함수
  • Job.join() : Job의 실행이 끝날때까지 대기하는 함수
  • Defferred.await() : Defferred의 실행이 끝날때 까지 대기하는 함수

코루틴은 제어되는 스코프 또는 프로그램 전체가 종료되면 함께 종료되기에 코루틴이 끝까지 실행되는 것을 보장하려면 일정한 범위에서 코루틴이 실행될때 까지 잠시 기다려주어야한다. 이 추가함수들은 모두 루틴의 대기를 위한 추가함수들이다. 이 세함수들은 코루틴 내부, runBlocking과 같은 루틴의 대기가 가능한 구문안에서만 동작이 가능하다.

 

class SplashActivity : AppCompatActivity() {

    //coroutinescope 객체 생성
    //dispatcher.main 사용해서 코루틴이 메인(ui) 쓰레드에서 실행되도록 설정한다
    val activityScope= CoroutineScope(Dispatchers.Main)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash)

        //코루틴을 시작하는 블록
        activityScope.launch {
            delay(3000)
            val intent = Intent(this@SplashActivity, LoginActivity::class.java)
            startActivity(intent)
            finish()
        }
    }

    //액티비티가 일시정지 상태로 전환될때 호출되는 생명주기 함수
    //현재 실행중인 코루틴을 취소
    //액티비티 일시정지되는 동안 불필요한 코루틴 실행 방지
    override fun onPause()
    {
        activityScope.cancel()
        super.onPause()
    }
}

코루틴에 대해서 배운 내용을 바탕으로 스플래시 화면을 구현하는 코드에 적용해 보았다. 설명은 주석으로 달아놓았다. onPause()메서드는 앱이 백그라운드로 전환되거나, 다른 액티비티나 다이얼로그 등이 떠서 현재 액티비티가 일시적으로 가려진 경우에 호출되는 생명주기 메서드이다.

예를 들어 사용자가 다른 앱으로 이동하거나 전화를 받거나 이런 액티비티가 잠시 멈출 때, 데이터 저장, 코루틴 등의 정리 작업을 수행하여 리소스를 효율적으로 관리하고 앱의 동작을 최적화하는 역할을 한다.

이 메서드를 사용해서 앱이 일시정지 상태로 전환될때 필요한 작업을 수행할 수 있다.

'Frontend > Kotlin' 카테고리의 다른 글

코틀린 Flow  (1) 2023.08.21
MVVM 패턴 적용기(2)  (0) 2023.08.15
MVVM 패턴 적용기(1)  (0) 2023.07.29
About DataBinding  (0) 2023.07.29
[안드로이드] 코틀린 아키텍처 패턴  (0) 2023.07.21