시배's Android

Kotlin Coroutines Deep Dive | 1장. 코틀린 코루틴을 배워야 하는 이유 본문

Book/Kotlin Coroutines Deep Dive

Kotlin Coroutines Deep Dive | 1장. 코틀린 코루틴을 배워야 하는 이유

si8ae 2024. 1. 15. 21:26
fun onCreate() {
	val new = getNewsFromApi()
    val sortedNews = news
    	.sortedByDescending { it.publishedAt }
    view.showNews( sortedNews )
}
  • 안드로이드에서는 하나의 앱에서 뷰를 다루는 스레드가 단 하나만 존재합니다.
  • 이 스레드는 앱에서 가장 중요한 스레드라 블로킹되면 안 되기 때문에, 이런 방법으로 구현할 수 없습니다.
  • 스레드 전환 : 블로킹이 가능한 스레드를 먼저 사용하고, 이후에 메인 스레드로 전환하면 된다.
    • 스레드가 실행되었을 때 멈출 수 있는 방법이 없어 메모리 누수로 이어질 수 있습니다.
    • 스레드를 많이 생성하면 비용이 많이 듭니다.
    • 스레드를 자주 전환하면 복잡도를 증가시키며 관리하기도 어렵습니다.
    • 코드가 쓸데없이 길어지고 이해하기 어려워집니다.
fun onCreate() {
	getNewsFromApi { news ->
    	val sortedNews = news
        	.sortedByDescending { it.publishedAt }
        view.showNews( sortedNews )
    }
}
  • 콜백 : 함수를 논블로킹으로 만들고, 함수의 작어빙 끝났을 때 호출될 콜백 함수를 넘겨주는 것입니다.
  • 콜백을 이용해 구현한 방식 또한 중간에 작업을 취소할 수 없습니다.
fun onCreate() {
	disposables += getNewsFromApi()
    	.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .map { news ->
        	news.sortedByDescending { it.publishedAt }
        }
        .subscribe { sortedNews ->
        	view.showNews(sortedNews)
    	}
}
  • RxJava : 리액티브 스트림을 사용합니다.
  • 데이터 스트림 내에서 일어나는 모든 연산을 시작, 처리, 관찰할 수 있습니다.
  • 리액티브 스트림은 스레드 전환과 동시성 처리를 지원하기 때문에 애플리케이션 내의 연산을 병렬 처리하는 데 사용됩니다.
  • subscribeOn, observeOn, map, subscribe와 같은 함수들을 배워야 합니다.
  • 취소하는 작업 또한 명시적으로 표시해야 합니다.
  • 객체를 반환하는 함수들은 Observable이나 Single 클래스로 래핑해야 합니다.

코틀린 코루틴의 사용

  • 코루틴을 특정 지점에서 멈추고 이후에 재개할 수 있다는 것입니다.
  • 코루틴을 사용하면 우리가 짠 코드를 메인 스레드에서 실행하고 API에서 데이터를 얻어올 때 잠깐 중단시킬 수도 있습니다.
  • 스레드는 블로킹되지 않으며 뷰를 바꾸거나 다른 코루틴을 실행하는 등의 또 다른 작업이 가능합니다.
  • 코루틴을 사용하는 가장 중요한 이유는 스레드를 사용하는 비용이 크기 때문입니다.
  • 스레드는 명시적으로 생성해야 하고, 유지되어야 하며, 스레드를 위한 메모리 또한 할당되어야 합니다.