본문 바로가기
Mobile App

[안드로이드] - 비동기 프로그래밍 기술 (etc. coroutine)

by Jman 2023. 1. 18.

코루틴에 대해서 블로그 작성을 하려고 다양하게 검색하면서 다른 블로거가 작성한 글들을 읽는 와중에 코루틴은 코틀린만에 전유물이 아니라는 걸 알게 됐다. 그래서 비동기 프로그래밍 기술 중 하나인 코루틴이라 생각을 달리하고, 비동기 프로그래밍 기술에 대해서 찾아보았다.

 

오랫동안 개발자로서 해결해야 할 문제가 있다. 사용자가 기다리거나 애플리케이션 확장을 방해하는 병목 현상을 일으키는 상황을 피하고 싶어 한다는 것이다.

 

이 문제를 해결하기 위해서 다음과 같은 접근 방식이 존재한다.

- Threading

- Callback

- Futures, promies, 그리고 그 밖에 다른 것들

- Rx (Reactive Extensions)

- Coroutines

 

아래에는 내가 써보았던 기술을 세 가지만 정리할 예정이다.

 

Threading (스레드를 이용하여 처리 ex. 멀티 스레드)

프로세스를 이용하여 동시에 처리하던 일을 스레드로 구현하는 경우, 메모리 공간과 시스템 자원 소모가 줄어들게 된다.

스레드 간의 통신이 필요한 경우, 별도의 자원을 이용하지 않는다.

전역 변수의 공간과 동적으로 할당된 공간(Heap)을 이용하여 데이터를 주고 받을 수 있다.

그렇기 때문에 프로세스 간 통신 방법에 비해서 스레드 간 통신 방법이 훨씬 간단하다.

심지어, 스레드의 컨택스트 스위칭은 프로세스의 컨텍스트 스위칭과는 달리 캐시 메모리를 비울 필요가 없기 때문에 더 빠르다.

 

따라서, 시스템의 throughput 이 향상되고 자원 소모가 줄어들며 자연스럽게 프로그램의 응답 시간이 단축된다.

이러한 장점 때문에 여러 프로세스로 할 수 있는 작업들을 하나의 프로세스에서 스레드로 나눠 수행하는 것이다.

 

하지만,

- 스레드는 저렴하지 않다. 스레드 컨텍스트 스위칭은 비용이 많이 든다.

- 스레드는 무한하지 않다. 시작할 수 있는 스레드 수는 기본 운영 체제에 의해 제한된다. 서버 측 애플리케이션에서 이로 인해 주요 병목 현상이 발생한다.

- 스레드를 항상 사용할 수 있는 것은 아니다. JavaScript 와 같은 일부 플랫폼은 스데르를 지원하지 않는다.

- 스레드는 쉽지 않다. 스레드 디버깅, 레이스 컨디션을 방지는 멀티 스레드 프로그래밍에서 겪는 일반적인 문제이다.

 

 

Callback (콜백함수)

콜백함수는 간단하게 설명하면, 함수가 끝나고 난 뒤에 실행되는 함수를 콜백 함수라고 한다.

또는, 다른 함수의 인자로써 이용되는 함수, 어떤 이벤트에 의해 호출되어지는 함수 등 다양하게 불린다.

 

콜백 함수를 이용하여, A로직을 끝날 때까지 기다리는 게 아닌, B 코드 로직을 수행하게 된다.

만약 A로직이 끝났을 때, A 로직에서 '나 끝났어.' 라고 하면, B 이후 C 코드가 실행하는 게 아닌, B 이후 A코드로 가서 마무리 짓게 된다.

여기서 '나 끝났어.' 가 콜백함수라고 생각하면 된다.

 

하지만,

- 중첩된 콜백은 어렵다. 일반적으로 콜백으로 사용되는 함수는 자체 콜백이 필요한 경우가 많다. 이로 인해 이해할 수 없는 코드로 이어지는 일련의 중첩된 콜백이 발생하고, 종종 크리스마스 트리라고 한다.

- 오류 처리가 복잡하다. 중첩 모델은 이러한 오류 처리가 다소 복잡하게 만든다.

 

코루틴

보통 Kotlin 언어를 사용할 때 비동기 코드 작업이 필요한 경우 사용된다.

특징은 일시 중단 가능한 계산이다. 즉, 함수가 특정 시점에서 실행을 일시 중지했다가 나중에 재개할 수 있는 개념이다.

또한 코루틴은 1958년에 일찍 만들어졌고, 수십년동안 사용되어 왔다. Kotlin 에서만 사용되는 것이 아니라 다른 프로그래밍 언어에서도 사용된다. 하지만, 주목해야할 부분은 Kotlin 에서 구현되는 방식으로 대부분 기능이 라이브러리에 위임되어 있다.

 

co + routine : 협력하는 루틴

 

코루틴에 대해서는

아래 링크를 통해, 더 깊이 알아보자.

https://devnuts.tistory.com/185

https://devnuts.tistory.com/184

 

참고

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