본문 바로가기

카테고리 없음

Multi Thread

오늘은 Android 앱을 개발하면서 느낀 Thread에 대해서 몇가지 적어보려고 합니다.

언어레벨에서 지원하는 Thread,  Android 에서 제공하는 Async Task의 Deprecated, RxJava와 Coroutine 까지 적어보려고 합니다.

 

실제로 제가 개발하면서 항상 드는 의문점이 있었습니다.

멀티스레드 기법을 사용하기 위해 왜 굳이 라이브러리를 사용하는가에 대해서 큰 의문점이 들었습니다.

단지 언어레벨에서 지원하는 Thread를 사용하면 될 것 이지 왜 라이브러리를 사용하는지에 말이죠.

 

이를 알아보기 전에 먼저 Android의 Async Task에 대해서 몇가지 적어보겠습니다.

1. Aysnc Task란?

Aysnc Task는 안드로이드에서 UI Thread(Main Thread) 에 직접 접근할 수 있도록 해주어 데이터의 변화를 보여주기 위해 api를 제공하였습니다.

복잡하게 Handler를 사용하지 않고도 백그라운드 작업이 가능 했으며, UI를 업데이트를 할 수 있게 해주었습니다.

 

2. Deprecated 된 이유

Main Thread가 Aysnc Task로부터 작업을 진행 할때 Context Leak, Memory Leak등 많은 문제점이 있었습니다. 거기다 버전문제까지 발견됐다고 하니 Android에서는 더이상의 문제 해결은 어렵다고 판단되었는지 Deprecated되었습니다.

Android 11부터 Deprecated 되었습니다.

 

3. RxJava & Coroutine

많은 회사들이 Android 앱 개발을 할때 비동기 프로그래밍을 위해 이 두가지를 사용하는 것 같습니다.

취지는 좋습니다. MainThread의 부담을 덜어주는것!

Main Thead는 UI만 그리게하고 Server와의 통신, DB와의 작업, 다른 연산작업 들은 Background Thread가 작업 하도록 하는 것이죠.

 

근데 왜? 굳이 이걸 써야하는걸까요?

 

정답부터 말씀드리면 Life Cycle 때문입니다.

이 뿐만이 아닙니다. 스케줄러 및 디스패처를 편리하게 교체 가능, 콜백 방식의 문제점,  간편한 비동기 이벤트 처리등을 할 수 있죠.

그래서 구글 Android는 RxJava를 위해 RxAndroid를 제공하고 있고, Coroutine 같은 경우엔 Coroutine을 위한 Jetpack 라이브러리 까지 제공하고 있습니다.

 

그럼 RxJava 와 Coroutine이 Android의 Life Cycle과 무슨 연관이 있을까요?

RxAndroid는 LifeCycle 관리를 위해 Activity와 Fragment의 LifeCycle을 RxJava에서 사용할 수 있게 합니다.

Coroutine은 Kotlin에서 ViewModelScope을 제공 하여 ViewModel의 LifeCycle과 함께 할 수 있습니다. 

 

때문에 View에게 필요한 모델을 담당할 ViewModel이 Activity나 Fragment가 Destory 될때 RxJava나 Coroutine도 공유된 LifeCycle과 함께 없어지면서 메모리 누수를 방지 할 수 있는 것이죠.

 

다음에 기회가 된다면 RxJava와 Coroutine(Flow와 함께) 을 활용하여 코드레벨로 적어보는 시간을 꼭 가져보겠습니다.