UI 스레드 블로킹 방지: ViewModelScope에서 CPU 집약적인 UI 상태 업데이트 로직은 기본적으로 메인 스레드에서 실행되어 UI를 블로킹하고 프레임 드롭을 유발할 수 있습니다. 이를 방지하려면 Dispatchers.Default를 사용하여 백그라운드 스레드에서 작업을 위임해야 합니다. ⚡
화면 전환 시 코루틴 취소 문제: ViewModelScope에서 데이터 저장 및 동기화와 같은 장기 실행 작업을 시작한 후 즉시 화면을 전환하면(예: navigateUp()) ViewModelScope가 취소되어 작업이 중단될 수 있습니다. ❌
코루틴 취소 문제 해결 (1) - 이벤트 기반 UI: ViewModel이 작업 완료를 UI에 알린 후(예: Channel을 통한 일회성 이벤트) UI가 탐색을 수행하도록 하여, ViewModel이 안전하게 종료될 수 있도록 합니다. 📢
코루틴 취소 문제 해결 (2) - 앱 바운드 스코프: ViewModel의 생명주기에 묶이지 않고 앱 전체 생명주기에 묶이는 ApplicationScope를 사용하여 중요한 장기 실행 작업을 수행합니다. GlobalScope는 강한 결합과 테스트의 어려움 때문에 권장되지 않습니다. 📱
병렬 코루틴의 순차 실행 방지: launch 또는 async로 병렬 작업을 시작한 후 각 작업마다 즉시 join() 또는 await()를 호출하면 작업이 순차적으로 실행되어 병렬 처리의 이점을 잃게 됩니다. ⏩
진정한 병렬 실행: 모든 독립적인 코루틴을 먼저 시작하고, 각 Job 참조를 저장한 다음, 모든 작업이 시작된 후에 한 번에 join()을 호출하여 병렬 실행을 보장합니다. 🚀
취소 불가능한 폴링 태스크: while(true) 루프 내에서 delay()와 같은 취소 가능한 함수를 사용하더라도, 코루틴이 취소 가능한 지점 사이에서 취소될 경우 이전 코루틴 인스턴스가 완전히 종료되지 않아 여러 인스턴스가 동시에 실행되며 불필요한 리소스 낭비와 로그 스팸을 유발할 수 있습니다. 👻