Coroutine 기본 개념잡기

2022. 12. 27. 00:18Coroutine

코루틴이란 무엇일까?

 

먼저 코루틴이 무엇인지 알기 전에 왜 코루틴이 나왔을까? 부터 생각해 보겠습니다.

 

안드로이드의 UI는 기본적으로  "메인스레드"  에서 동작한다고 합니다.

그래서 메인스레드를 보통  "UI 스레드"  라고도 부릅니다.

하지만 작업 시간이 오래 걸리거나 , 리소스를 많이 사용하는 작업을 메인스레드 하나에서 모두 동작시키게 되면, 

흔히 말하는 "어플리케이션이 응답하지 않습니다" 라는 ANR 이 나타납니다.

 

이러한 성능과 작동의 문제로 인해 스레드 관리는 필수라고 생각합니다. 

성능이 낮은 앱을 과연 누가 사용할까요??

 

어떻게 하면 더 효율적으로 몸집이 큰 작업들을 관리할 수 있을까 라는 문제를 해결하기 위한

많은 것들 중 하나가 바로 "코루틴" 입니다.

출처 :  https://developer.android.com/kotlin/coroutines#executing-in-a-background-thread

 

코루틴  은 안드로이드 기기에서   "비동기적으로 실행하는 코드를 단순화할 수 있는 동시성 디자인 패턴"   이라고 합니다.

 

여기서 동시성 디자인 패턴이란 간단히 멀티 스레드 프로그래밍을 다루기 위해 소프트웨어 엔지니어링에서 사용하는 디자인 패턴을 말하며, 비동기 실행은 하나의 task가 실행되어도 결과를 기다리지 않고 다른 task도 실행 가능한 방식을 말합니다.

 

결국 코루틴은 스레드의 작동을 멈추거나 막지 않기 위해, 즉 ANR 하지 않기 위해 성능을 향상하기 위한 목적으로 만들었고, 그 작업을 위해 사용하는 코드를 단순하게 해주는 것입니다. 

 

 코루틴의 특징으로는 

1. Lightweight :

suspension 지원으로 싱글 스레드에서 여러 코루틴을 실행시킬 수 있고 동시 작업으로 메모리를 절약할 수 있습니다.

2. Fewer memory leaks :

structured concurreny 를 사용하여 스코프 안에서 operation을 실행합니다.

3. Built-in cancellation support 

: Cancelleation 은 실행 중인 코루틴 hierarchy를 통해서 자동적으로 전달합니다.

4. Jetpack integration

: jetpack 에는 여러 코루틴을 support 하는 extensions 들이 들어있습니다.

 

코루틴이 기존의 Thread를 이용한 비동기 처리의 차이점은 무엇일까??
코루틴도 Thread에서 동작하지만 무엇이 다른 걸까??

 

코루틴은 스레드보다 더 작은 단위입니다.

 

Thread A : Task1

Thread B : Task2

 

가 있다고 해보겠습니다.

 

여기서 Task1을 처리하다가 Task1을 위해 Task2가 필요해 잠시 넘어갑니다.

이때 Task1은 잠시 멈춰두고 Thread B 로 넘어갔다가 Task2가 끝나면 다시 Task1로 넘어옵니다.

이러한 Thread 의 성질을 Concurrency 동시성이라고 합니다.

동시에라고 생각해서 동시에 시작해서 처리한다는 게 아닙니다.

저는 이 Concurrency를 보고 처음에 동시라는 말 때문에 많이 헷갈렸습니다.

아래에 그림을 보시면 좀 더 이해하기 수월합니다.

Concurrent 는 파란색 일과 빨간색일을 작게 쪼개 번갈아가면서 처리를 합니다.

결과를 보면 동시에 끝난 것처럼 느껴질 것입니다. 

이것처럼 시작을 동시에 하는 건 Parrallel 입니다. 

동시에 한다는 것보단 정확하게는 일을 왼손과 오른손 나눠서 따로 할 수 있다 생각해야 합니다.

이게 Parallel 병렬성입니다.

동시성은 일이 동시에 끝나는 것처럼 보인다라고 생각해야 합니다.

하지만 한 손으로 번갈아가면서 작업을 한다입니다.

이런 동시성의 개념을 코루틴에서 더욱 활용하여 좋게 합니다.

 

하나의 Thread 에서 다른 Thread로 일을 번갈아가면서 하면 왔다 갔다 하는 비용이 듭니다.

이러한 교환을 Context Switching 이라고 합니다.

코루틴은 이런 비용을 줄이고 더욱 Thread를 효율적으로 하기 위해 

일을 나누어 여러 개의 코루틴 작업으로 나눕니다.

 

Thread A : Task 1

Thread B : Task 2

이렇게 되어있는 작업을 이제는 

Thread A : coroutine 1 , coroutine 2 

Thread B : coroutine 3 , coroutine 4

이렇게 일을 나누어서 처리합니다.

 

Thread 를 교환하던 방식은 Task 1, Task 2 를 왔다 갔다 하면서 처리했다면

coroutine 을 이용해 Task1 을 처리하다가 Task2 가 필요하면 Thread A 에서 Task2 를 처리하고 Task1 을 처리하는 방식으로 Thread를 번갈아가면서 하지 않고 처리할 수 있습니다. 

그래서 coroutine 을 이용하면 content switching 을 통한 비용을 줄이는 방식으로 프로그래밍 하는게 좋습니다.

그래야 coroutine 을 통한 이점을 쓸 수 있으니까요.

 

코루틴은 

coroutine 1 , coroutine 2 가 있다고 했을때

 

coroutine 1 을 하는동안 메인스레드는 다른 일을 처리합니다.

coroutine 1이 끝나면 돌아가서 coroutine 2 를 진행하고 다시 메인스레드는 다른 일을 하는 방식으로 동작합니다.

 

간단하게 알아보았습니다. 

다음 코루틴 글에서는 자세하게 Android에서 어떻게 코루틴을 다루는지 알아보겠습니다. 감사합니다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Coroutine' 카테고리의 다른 글

coroutine dispatchers, Flow Hot & Cold  (0) 2023.06.13
coroutine suspend function, async, await  (0) 2023.06.12
coroutine basic  (0) 2023.06.10