Programming Language/Kotlin

[Kotlin] 비동기 프로그래밍 기술

개발왕 금골드 2021. 6. 19. 22:11
반응형

안녕하세요 골드입니다.

 

비동기 프로그래밍은 더 이상 선택이 아닌 필수임에 따라 프로세스 블록에 대한 해법은 꽤 오래 연구되어 왔습니다. 코틀린 공식 문서를 참고하여 그 다양한 기술 해법에 대해서 간략하게 이야기하고자 합니다. 

 

https://kotlinlang.org/docs/async-programming.html#threading

 

Asynchronous programming techniques | Kotlin

 

kotlinlang.org

 

  • 스레드
  • 콜백
  • 미래시
  • 리액티브 프로그래밍
  • 코루틴

 

스레드

 가장 잘 알려진 방법입니다. 시간이 오래 걸리는 작업은 ui에 영향을 미칠 수 있습니다. 애플리케이션에 경우 최악은 ANR이 발생하여 앱이 멈출 수 있다는 것입니다. 이러한 경우 분리된 스레드에서 작업을 할 수 있습니다. 가장 잘 알려진 방법입니다. 다만 몇 가지 단점들이 존재합니다.

 

  • 먼저 스레드는 비용이 적지 않습니다. 스레드를 사용할 경우 Context-Switching 비용이 발생하게 되는데 이는 적지 않은 비용이 요구됩니다.
  • 스레드는 제한적입니다. 무수히 많은 스레드를 끊임없이 생성할 수는 없습니다. 이러한 점은 서버에서 병목현상을 야기합니다.
  • JavaScript의 경우 스레드를 지원하지 않습니다. 항상 사용할 수 없다는 것입니다.
  • 다들 알고 있는 단점 중 하나는 쉽지 않다는 것입니다. 다수의 스레드를 사용할 경우 프로그래밍으로 모든 상황에 대한 문제를 해결해야 하는데 이것은 쉬운 일이 아닙니다.

 

콜백

 콜백은 함수를 매개변수로 전달하는 아이디어에서 착안하였습니다. 프로세스가 완료되었을 때 매개변수로 전달된 함수를 호출하는 방식으로 사용할 수 있습니다. 다만, 콜백을 사용하였을 경우 몇 가지 눈에 띄는 단점이 역시 존재합니다.

 

  • 내재된 콜백은 복잡함을 야기합니다. 일반적으로 내재되어 있는 콜백 역시 함수를 포함하는 경우가 많은데 이렇게 되면 다수의 내재된 함수들을 호출하게 됩니다. 이로 인해 복잡성이 증가합니다.
  • 위에 이유가 가장 큰 이유가 되겠습니다. 하나 덧붙이자면 이러한 이유로 인해 에러 처리가 쉽지 않다는 것입니다.

 

미래시

 저는 미래시라고 명명하였는데, 그 이유는 이 공식 문서에서 처음 접하였기 때문입니다. 공식 명칭을 모르겠습니다. 문서에 따르면 미래시라는 것은 콜백과 비슷한데 특정 미래에 어떤 리턴 값을 반환한다는 것을 약속하는 방식입니다. 이는 순차적으로 프로그래밍하는 일반화된 모델과 완전히 다른 프로그래밍 모델입니다. 그렇기 때문에 다른 API를 사용하며, 특정 리턴 값을 반환해야 합니다.

 

 

리액티브 프로그래밍

 Rx 라이브러리는 이미 많은 곳에서 사용되고 있습니다. 앞으로 소개할 코루틴이 있긴 하지만, 리액티브 프로그래밍에 어떤 치명적인 단점이 있어서 코루틴을 사용하라고 소개하진 않습니다. 리액티브는 이미 자리를 잡았고 사용하기도 용이하며, 에러 처리도 준수하기 때문입니다.

 리액티브 프로그래밍은 옵서버 패턴으로 데이터를 다룰 수 있도록 합니다. 기존의 프로그래밍 모델과는 조금 다른데 "모든 것은 스트림이며 관찰 가능하다."라는 것이 리액티브 프로그래밍이라고 할 수 있겠습니다. 데이터를 하나의 흐름으로 보고 구독자들은 이 데이터의 흐름을 관찰할 수 있습니다. 다양한 언어에서 Rx를 지원하고 있습니다.

 

 

코루틴

 코틀린은 코루틴을 지원합니다. 코루틴이란 완전히 새로운 개념은 아니고 이미 존재하는 개념입니다. 중지를 지원한다는 점이 스레드와 가장 큰 차이점이 되겠습니다. 어떤 시점에 함수를 일시 정지하고 이후에 다시 재개합니다. 여기서 재개하는 시점이 언제인지는 알 수 없습니다.  코틀린 코루틴에 가장 큰 장점은 순차적으로 작성된다는 점입니다. 기존에 작성했던 프로그래밍에서 크게 벗어나지 않습니다. 

 

fun postItem(item: Item) {

 launch {

  val token = preparePost() 

  val post = submitPost(token, item)

  processPost(post)

 }

}

suspend fun preparePost(): Token {

 // makes a request and suspends the coroutine

 return suspendCoroutine { /* ... */ }

}

Copied! from kotlinlang.org

 

 저는 처음에 비동기에 대한 기술을 공부할 때 코루틴으로 기술해보고 공부하고 운영체제를 공부하였습니다. 이후에 리액티브 프로그래밍 역시 사용해보았는데, 개인적으로 코루틴 코드가 좀 더 친숙하다고 느껴졌습니다. 먼저 공부한 것도 있고, 코틀린 코루틴이 좀 더 기존에 작성하였던 프로그래밍 방식과 닮아있다고 생각했기 때문입니다. 리액티브 프로그래밍이 어렵다고도 많이 이야기하는데, 어려운 건 맞습니다만, 코루틴도 Flow나 안드로이드에 맞춰 사용하다 보면 똑같이 어려워서 그 부분은 단점인지 잘 모르겠습니다. 안드로이드 프로그래밍에서 Rx가 주류로 자리를 잡았기 때문에 공부를 하고 있습니다만, 공식 문서를 살펴보면서 코루틴에 대한 공부도 병행해야겠습니다.

 

이번 포스팅은 단순히 어떤 기술이 있는지 살펴보는 글이었습니다. 

 

여기까지 골드였습니다.

감사합니다.

반응형