본문 바로가기

Android/Coroutine18

[Android] 코루틴(Coroutine)의 Channel Channel 이란Channel은 코루틴 간의 데이터를 전송하기 위한 통신 수단으로, stream처럼 데이터를 주고받을 수 있는 인터페이스입니다.Channel의 구조는 BlockingQueue와 비슷하며, 동일하게 Thread-Safe 한 구조를 가지고 있습니다.차이점이 있다면 BlockingQueue는 값을 전달하는 과정에서 스레드를 block하지만, Channel은 스레드를 block하지 않고 suspending 하는 특징이 있습니다. Channel은 데이터를 제공하는 채널인 SendChannel 과 데이터를 소비하는 채널인 ReceiveChannel 로 이루어져 있습니다.  Channel은 송신자인 prooducer와 수신자인 consumer 사이에서 데이터를 주고 받는 중간 다리 역할을 하며,큐(.. 2025. 2. 12.
[Android] 예외로인한 코루틴 종료 과정 살펴보기 코루틴에 대한 포스팅을 통해, 코루틴의 예외 전파 방식과 이를 방지하는 다양한 방법을 살펴보았습니다.이번 포스팅에서는 코루틴이 취소, 종료 메커니즘을 내부코드를 기반으로 분석하며, 전파 방식에 따른 예외 처리 방법을 구체적으로 다뤄보겠습니다.예외로인한 코루틴 종료 과정 살펴보기코루틴은 다음과 같은 스테이트 머신을 가지고 있습니다. 코루틴의 예외 처리 과정에 대해서 좀 더 자세히 알아보기 위해서 살펴보아야 할 상태는 CANCELLING 상태이며, 이 상태는 코루틴이 예외에 의해 종료될 경우 마지막으로 거쳐가는 상태입니다.만약 부모 코루틴은 예외 발생 없이 정상적으로 실행을 마친 상태에서 자식 코루틴들의 종료를 기다리는 상태(COMPLETING)에 있다 하더라도 자식 코루틴 중에 일부가 부모로 예외 발생을 .. 2025. 2. 10.
[Android] SupervisorJob, SupervisorScope에 대한 이해 코루틴의 예외 전파코루틴에서 예외가 발생하면, 그 코루틴은 취소되고 예외가 부모 코루틴으로 전파됩니다.만약 부모 코루틴에서도 예외가 처리되지 않으면, 예외는 루트 코루틴까지 예외가 전파될 수 있습니다.  하지만, 자식 코루틴 중 하나가 예외가 발생하더라도, 다른 코루틴의 실행에는 영향을 주지 않도록 처리해야 하는 경우가 있습니다. 예를들어, 여러개의 파일을 각 코루틴을 이용해 동시에 다운로드 할때, 특정 파일의 다운로드가 실패하더라도, 나머지 파일은 정상적으로 다운로드되어야 합니다. 이를 해결하기 위해 대표적으로 try-catch를 통해 예외를 개별적으로 처리할 수 있으나, 코루틴에서는 이를 더 간단하고 효율적으로 처리할 수 있는 SupervisorJob, SuperviosrSocpe를 제공합니다.이러한.. 2025. 2. 9.
[Android] Callback, Reactive 그리고 Coroutine 들어가기 전에개발자로서 우리는 우리를 더욱 생산성 있게 만들어주고 편안하게 해주는 새로운 기술들을 사용하는 것을 기꺼이 즐깁니다. 어떤 새로운 기술을 학습할 때 그 기술의 개념이 쉽게 와 닿지 않으면 먼저 기존에 알고 있는 유사한 기술이 없는지 떠올려보고, 있다면 새로운 기술과의 비교 / 대조를 통해 새로운 것의 개념을 구체화 하여 이해 하곤 합니다. 이러한 방식의 학습이 가능한 이유는 대부분의 새로운 기술이 “무” 에서 나오는 것이 아니고, 기존 기술의 약점을 보완하고 강점을 강화하는 방향으로 발전되어 나오기 때문입니다. 이번에 살펴 볼 코루틴도 그동안 우리가 비동기 처리를 위해 작성해 왔던 코딩 스타일을 보다 직관적이고 안전하게 작성할 수 있도록 돕기 위해 고안되었습니다. 이번 파트에서는 “사용자 설.. 2025. 2. 6.
[Android] 중단(suspend)함수를 비동기적으로 실행하는 방법도 있을까? 하나의 코루틴 내에서 중단 함수(suspend)를 호출하면 기본적으로 순차적으로 실행됩니다. 이는 일반적인 함수 호출과 유사하게, 앞선 함수가 완료된 후에 다음 코드가 실행되기 때문입니다. 개발을 하다 보면 네트워크를 통해 API를 호출할 때가 많습니다. 이때 상황에 따라 두 가지 방식으로 결과를 처리할 수 있습니다:동기적으로 결과를 받아 처리해야 하는 경우비동기적으로 여러 요청을 동시에 처리해야 하는 경우로그인 요청처럼 이전 결과가 다음 로직에 영향을 주는 경우 순차적인 실행이 필요하지만,2번과 같이 여러개의 API를 동시에 호출하여 전체 처리 시간을 줄이고 싶을 때는 비동기 실행이 더 효율적입니다. 이번 포스팅에서는 어떻게 하면 suspend함수를 비동기적으로 처리할 수 있을지에 대해 알아보도록 하겠.. 2025. 2. 5.
[Android] 중단(suspend)함수란 무엇이고 어떻게 동작할까? (feat. delay()) 중단(suspend)는 코루틴에서 어떻게 작동되는가?코루틴을 suspending 한다는 것은, 코루틴을 중간에 일시 정지하는 것을 의미합니다. 이것은 비디오 게임을 중간에 멈췄다가 다시 실행하는 것과 유사합니다. 코루틴을 일시 정지 하면 Continuation 객체에게 지금까지 실행한 정보(로컬 변수, 현재 까지 실행된 라인 등)들을 담고, 함수에서 빠져나옵니다. 그리고 다른 함수를 수행하다가 resumeWith() 을 호출 받고 다시 이전 함수를 처리하는 식으로, 일시정지를 구현합니다.  재개(Resume)코루틴 내부에서 일시 중지를 하고 싶다면, suspend 함수를 호출해야 일시 중지가 됩니다.하나의 예를 통해 알아보도록 하겠습니다.suspend fun main() { println("befo.. 2025. 2. 5.