Callback지옥으로부터 Coroutine까지의 긴 여정

Ted Park
박상권의 삽질블로그
4 min readSep 8, 2021

지금까지 비동기 작업의 처리를 위해서 해왔던 과정들을 되짚어봅니다.
주어진 요구사항을 Callback, High Order Function, RxJava, Coroutine으로 구현했을때의 사용방식에 대해 간단한 코드로 비교합니다.

안드로이드 개발을 하면서 우리는 항상 비동기 처리에 노출되며 살아 왔습니다.(서버 통신, 위치 정보, DB조회, 기타 등등)

Async하게 이루어지는 비동기작업을 처리해온 긴 여정을
아주 간단한 코드들을 통해 단계별로 함께 되짚어보겠습니다.(윤여정 아님)

여러분들은 지금 비동기작업 요구사항을 어떤 방식으로 처리하고 계신가요?

요구사항

  1. name에 해당하는 User 정보를 가져옴
  2. User의 직업이 개발자라면 월급을 1억원으로 변경하고,
    그렇지 않다면 100원으로 변경
  3. User에게 급여가 변경되었다는 것을 알림

Stage 1: Callback

안드로이드가 태어날때부터 존재했던 Callback입니다.

“어, 그래. 니가 하라는거 하고나서 다 하면 알려줄게~”

Callback은 어떤 언어에나 있는 개념이고,
안드로이드에서도 처음부터 있었기 때문에 모든 개발자들에게 익숙합니다.

하지만, Callback을 사용하다보면 누구나 지옥을 경험하게 됩니다.

일명 콜백지옥

연계된 비동기작업을 계속 이어서 하게 되는경우,
Callback이 계속 중첩되어 indent(들여쓰기)가 계속 늘어나게 되면서
괄호천국을 만나게 됩니다.(나는 누구, 여긴 어디?)

Stage 2: High Order Function

Callback패턴의 또다른 문제는 비동기작업의 완료를 알기 위해서 Listener를 만들어 두고 해당 Listener를 사용해야 한다는 것입니다.

Kotlin을 사용하신다면 High Order Function(고차함수)를 사용해서
Listener class를 만들지 않고 바로 결과를 가져오도록 처리할 수 있습니다.

하지만 여전히 콜백지옥의 문제인 중첩문제는 해결되지 않았습니다.🤦🏻‍♂️

Stage 3: RxJava

Rx라는 개념은 안드로이드개발자 뿐만 아니라 iOS, Web개발자들도 알고 있고 많이 사용하고 있는 개념의 라이브러리 입니다.

자바스크립트 ES6에서 소개된 Promise 패턴의 개념이라고 볼 수 있습니다.

RxJava를 사용하면서 콜백지옥으로부터 벗어날 수 있게 되었습니다.
여러 작업들을 chaining하면서 순차적으로 수행시킬 수 있는것입니다.

Stage 4: Coroutine

RxJava로 콜백지옥을 벗어나긴 했지만 뭐어언가 마음에 들지 않는 느낌을 지울 수 없이 한동안 지내왔습니다.

그러던중 자바스크립트 ES7에서 소개된 Async/Await패턴을 보면서
이 개념이 너무나도 부러웠습니다.(안드로이드에도 추가해줘!!)
그렇게 우리는 Coroutine을 만났습니다.

코루틴의 비동기함수는 동기함수처럼 쓸 수 있습니다. 이것은 실화입니다

주어진 요구사항이었던 내용을 그대로 써내려가듯이
직관적으로 함수를 사용할 수 있는것이죠

어때요? 참 쉽죠?

지금까지 Async하게 이루어지는 비동기작업을 처리해온 역사를
아주 간단히 스윽 단계별로 함께 되짚어보았습니다.

저같은 11년차 안드로이드 개발자에게는
위의 과정들을 겪어오면서 지나간 수많은 삽질들이 주마등처럼 스쳐지나갑니다.

아주 단순한 요구사항에 대한 작업들에 대해서만 비교해서 소개해드렸습니다.

물론 RxJava, Coroutine을 사용하는 이유가 위에서 말씀드린 이유들 때문만은 아닙니다.
더 복잡하고 어려운 작업들을 RxJava나 Coroutine을 이용하면 효율적이고 직관적인 코드로 표현할 수 있습니다.

심지어 Coroutine을 사용하시면 RxJava를 대체할 수도 있습니다.
(Flow, Channel 등)

결론은 코루틴 킹왕짱! 코루틴 하세요!

감사합니다.

안드로이드 개발자들이 모여있는 오픈채팅방에 참여해보세요 .
Q&A 및 팁을 공유하는 방입니다.

--

--