Closed cheewr85 closed 2 years ago
Coroutine은 Android에서 비동기 처리를 사용하는데 있어서 Kotlin에서 쓸 수 있는 비동기 처리 방식임
이 방식을 통해서 이전에 Java로 비동기 처리할 때는 AsyncTask와 Thread와 관련하여서 처리를 하거나 콜백을 활용해서 처리했음
이런 방식을 대체하여서 Coroutine을 활용함, 이 Coroutine의 경우 비동기적 즉, 독립적으로 병렬되게 작업이 수행되거나 별도의 프로세스로 진행할 수 있고 main이나 UI Thread를 막고 실행이 되는 방식의 처리가 아님
그리고 suspend 즉, 이를 통해서 결과를 기다리는 동안 스레드의 차단을 해제해서 다른 함수나 Coroutine이 실행되게 할 수 있고 block이 되는 방식이 아니기 때문에 병렬적인 작업 처리나 동시성으로 작업이 가능함
그리고 이것이 Architecture와 결합되어서 각각에 대해서 Coroutine scope 제공 및 Thread 처리에 있어서 한결 수월하게 처리할 수 있음
정리하자면 Java에서 처리하는 예전 방식을 생각해보면 AsyncTask로 일일이 체크 혹은 Thread 처리를 별도로 추가해서 비동기 처리는 가능하더라도 코드 가독성과 다양한 측면에서 불편한 점이 존재했음
이를 Coroutine을 활용, suspend를 통해서 Thread 상에서 function의 결과를 기다리는데 있어서 이런 block하는 방식이 아닌 다른 작업도 진행하게 하고 코드적인 측면에서도 callback이나 난잡한 방식이 아닌 scope를 기반으로 launch를 하면서 더 효과적으로 쓸 수 있음(그리고 Android 공식언어로써 Jetpack와의 호환성도 잘 되어서 활용하는데 있어서 상당히 간결해지고 편리해짐)
그 외에 Coroutine과 관련된 디테일한 사항은 6.2에 정리한 내용과 Codelab을 봐도 무방함
여기서 한 가지 좀 더 알아볼 부분은 RxJava인데 우선 RxJava 역시 비동기 처리의 일환임, 앞서 Java에서 비동기 처리에 있어서 아주 초창기 방식은 AsyncTask 등의 Thread에 대해서 직접적으로 건드리면서 처리한 부분임
이걸 개선해보는 측면에서 Reactive Programming 즉, 데이터 흐름과 전달에 관한 프로그래밍 패러다임으로 이를 기반으로 관찰가능한 절차를 통해 비동기, 이벤트 기반으로 RxJava를 쓰는 것임, 이는 앞서 ViewModel이나 LiveData에서 data를 observe하는 observer pattern처럼 쓸 수 있는 것임
그렇기 때문에 이 방식은 정리하자면 기존의 Java의 방식을 생각하면 Thread 기반으로 프로그래밍을 하여 AsyncTask 등 Thread에 관련해서 직접적 처리를 했다면 이를 개선해서 함수형 프로그래밍 방식으로 observer pattern을 고려하여서 이런 처리를 할 수 있는 부분이 RxJava라고 볼 수 있음
이 반응형 프로그래밍은 데이터의 흘므을 스트림으로 처리하여 하나의 데이터 흐름이 다른 데이터 흐름으로 변형되기도 하고, 여러 데이터 흐름이 하나의 흐름으로 변경될 수도 있음
그래서 이 흐름을 observable 즉, 이에 맞는 것을 관찰하면서 연산하거나 바꾸거나 데이터를 발행하는 방식으로 되는 것임
함수형이라는 것도 그래서 이것을 쓰게 된다면 함수형 프로그래밍처럼, 활용해서 진행할 수 있기 때문임
도식화하면 아래와 같음
마치 LiveData와 ViewModel에서 observer를 설정해서 처리하듯이 RxJava 역시 이와 유사하게 처리하는 것으로 볼 수 있음
그래서 이 방식이 어떻게 보면 콜백 방식이나 AsyncTask, Thread를 처리하는 것보다 observable과 함수를 활용해서 데이터나 처리에 있어서 개선했다고 볼 수 있음
여기서 추가로 RxJava와 Coroutine에 대해서 비교를 할 수 있음, 왜냐하면 둘 다 전통적인 비동기 처리 방식을 개선한 방향으로 사용했기 때문에
먼저 Java에서 일반적으로 처리하는 비동기 방식에서 그 방식을 개선한 부분이 RxJava의 방식이라고 볼 수 있음
그렇게 주로 비동기 처리를 하다가 안드로이드에 공식언어로 코틀린이 채택되면서 RxJava로 처리하는 방식이 Coroutine을 활용하여서 다시 한 번 개선을 이룸
하지만 이 두 가지 방식이 뭐가 더 낫다는 방식으로 비교할 순 없음 그저 흐름을 따지면 Android가 Java 기반으로 시작해서 러프하게 비동기 처리를 한 것이 RxJava로 좀 더 개선을 한 것이고 그 이후 Kotlin이 공식언어로 채택되면서 Coroutine이 비동기 처리 방식으로써 자리 잡아 활용한 것임
마지막으로 이러한 RxJava의 방식을 어느정도 활용하여 비동기 처리 방식에 있어서 Coroutine의 Flow라는 방식도 있음
어쨌든 RxJava가 Java 기반이었고 Kotlin이 공식언어로 채택되었지만 이 자체를 갑자기 마익그레이션 하는데 있어서 어려움도 있을 것이 분명했고 이 방식이 익숙했다면 Kotlin Coroutine으로 갈아 엎는데 어려움이 있었을 것임
하지만 Coroutine Flow를 보면 데이터 스트림을 활용 RxJava의 유사함을 볼 수 있음, 이는 어떻게 보면 RxJava의 대안으로써 활용할 수 있다고 볼 수 있음
당장 Flow나 RxJava를 통한 처리는 해본 것이 없기 때문에 딱 이 정도만 짚고 넘어감
최종적으로 정리하자면 기존의 Java를 기반으로 일반적으로 Thread 처리와 AsyncTask 등 Component를 활용했다가 좀 더 효율적인 비동기 처리를 위해 Reactive Programming 개념이 도입되어 RxJava를 통해 스트림으로 처리를 하였고 나중에 Kotlin이 공식언어로 채택된 이후 이런 비동기 처리 방식이 Coroutine을 통해 적용을 할 수 있었지만 RxJava와는 다른 방식이었고 이를 좀 더 RxJava와 유사하게 처리한 부분이 Coroutine Flow라고 볼 수 있음
결론적으로 전체적인 흐름이 위와 같이 된 것이고 성능적인 차이가 있을 수 있지만 비동기 처리 방식에 있어서 RxJava를 활용할 수도 Coroutine을 활용할 수도 있음
[질문]
Coroutine과 관련하여 비동기 처리와 엮어서 Thread 환경을 기반으로 정리하기
++ 추가로 다른 비동기 처리 방식에 대해서 알아보기(RxJava 등)