[Android] Coroutine 이해하기 (1) : 코루틴이란 무엇인가?

uuranus·2024년 1월 15일
0
post-thumbnail

안드로이드 앱 개발을 하다보면 네트워크 요청할 때 코루틴을 사용하게 된다. 하지만 막상 코루틴을 왜 써야하는지 코루틴이 왜 좋은지, 스레드보다 가벼워서 좋다고 하는데 왜 가벼운 것인지는 잘 모르겠어서 공부해보기로 했다.

Coroutine

코루틴은 비동기적으로 실행되는 코드를 간소화하기 위해 Android에서 사용할 수 있는 동시 실행 설계 패턴입니다

공식문서에 나와있는 내용이다.

비동기 vs 동기

동기(synchronous) 는 이전에 실행한 작업이 완료가 되어야 다음 동작을 실행하는 것이다. 프로그램이 동기적으로 동작한다.

비동기(asynchronous) 는 이전에 실행한 작업의 완료를 기다리지 않고 다음 동작을 실행할 수 있는 것이다. 이전에 실행한 작업은 완료 응답값이 돌아오면 미리 선언해둔 콜백함수를 실행시켜서 완료 이후에 해야할 일을 처리할 수 있다.

네트워크를 통해 데이터를 가져오거나 내부 데이터베이스에서 데이터를 가져오는 등 시간이 오래걸리는 작업이 존재한다. 만약, 이 응답을 계속 기다린다면 ANR(Application Not Responding)이 뜰 것이다.

Android에서만 쓸 수 있는가?

아니다.
코루틴은 이전부터 존재하는 개념이고 코틀린이 코루틴을 구현할 수 있도록 지원을 해주는 것.
1.3부터 지원을 하게 되었고 kotlinx.coroutines이라는 패키지를 import하면 코루틴 빌더를 통해서 만들어둔 코루틴을 쓸 수 있는 것이다.

동시 실행

동시성은 병렬성이랑 많이 헷갈리는 개념이다.
병렬성 (Parallelism) 은 실제로 여러 스레드나 프로세스를 통해서 물리적으로 동시에 실행하는 것
동시성 (Concurrency) 은 하나의 스레드나 프로세스가 여러 작업을 빠르게 실행하여 여러 작업이 마치 동시에 실행되는 것처럼 보이도록 하는 것이다.

코루틴은 중간에 자신의 작업을 yield하면서 다른 코루틴이 동일 스레드에서 실행될 수 있게 해주어 단일 스레드에서 여러 코루틴을 실행해 마치 동시에 실행하는 것처럼 보이도록 하는 방식이다.

비선점형

위 내용에서 코루틴은 중간에 자신의 작업을 yield하면서 다른 코루틴이 동일 스레드에서 실행될 수 있게 해준다고 했다. 그렇다면 자신이 yield할때까지는 실행을 계속하는 비선점형 방식이다. 왜 선점형으로는 안 하는 걸까?

그 이유는 context switching 때문이다. 중간에 일정 시간마다 계속 context switching을 해야하는 것보다는 비선점형이 context switching하는 횟수도 적어 비용이 적게 들 것이다.

스레드보다 가볍다?

우선은 코루틴은 스레드 내에서 실행되니까 스레드보다는 작업 작업단위라서 가볍다고 생각할 수도 있다.
1. 코루틴은 동시성 프로그래밍으로 하나의 스레드에서 여러 코루틴을 실행할 수 있다.
-> 멀티스레딩보다 적은 수의 스레드로 비동기 프로그래밍을 할 수 있다.
2. 코루틴은 비선점형이다.
-> 스레드가 선점형으로 동시 프로그래밍을 하는 것보다 Context Switching 횟수와 비용이 적게 든다.

결론적으로 적은 스레드와 Context Switching으로 비동기 프로그래밍을 할 수 있기 때문에 스레드보다 가볍다고 하는 것

비동기 vs 동시성 vs 병렬성

사실 공부하면서 이 부분이 제일 많이 헷갈렸다.

동시성의 예시를 하나 생각해보자.
여러 이벤트가 동시에 발생해서 처리해야하는 경우가 발생했다.

동시성은

  • 이 여러 이벤트들은 하나의 스레드가 여러 이벤트들을 빠르게 돌리면서 마치 동시에 이벤트가 처리되는 것처럼 보이게 할 수 있다.

병렬성은

  • 여기서 실제로 이벤트들이 각각 다른 스레드가 맡아서 동시에 처리되고 있는 것

비동기는

  • 이 중에 이벤트 1이 중간에 네트워크 요청을 해야 할 때 요청한 후 기다리지 않고 다음 이벤트 처리 작업을 하는 것
    -> 여기서 네트워크 요청 작업을 동일 스레드가 동시성으로 처리해 줄 수도 있고 새로운 스레드가 병렬적으로 처리해 줄 수도 있는 것
profile
Frontend Developer

0개의 댓글