Coroutine 정복기(1) - 왜 써야할까?

동키·2025년 1월 27일

Kotlin

목록 보기
1/10

코루틴 왜 써야할가?

"비동기 코드를 작성할 때 코루틴을 사용한다"를 외우고 아무생각 없이 코루틴을 사용해왔습니다(작동원리도 모르고 사용).
이번 포스트에서 코루틴을 사용했을 때 어떤 장점이 있는지 알아보겠습니다.


코루틴의 등장배경

단일 스레드 사용의 문제를 해결하기 위해 멀티 스레드 프로그래밍이 등장했습니다.
멀티 스레드 프로그래밍이란 여러 스레드를 사용해 작업을 처리하는 프로그래밍 기법입니다.

멀티 프로그래밍 기법을 사용하면 어떤 이점이 있을가요?
위 그림처럼 여러 스레드가 동시에 작업을 처리하면 단일 스레드만 사용하는 것에 비해 처리 속도가 매우 빨라지며 병렬 처리가 가능하지게 됩니다.

오 멀티 프로그래밍 이녀석 좋은 녀석인걸?

대표적인 친구로 Executor 이 있습니다.

Executor

개발자가 스레드를 직접 관리할 필요 없이 작업 대기열에 작업을 제출하기만 하면 됩니다.

  • 스레드의 재사용성 증가
  • 스레드풀 사용(스레드 집합)
  • 개발자는 스레드풀에 속한 스레드의 개수를 설정, 스레드풀을 관리하는 서비스에 작업 제출

즉 위와 같은 그림으로 작동하게 됩니다.
이렇게 되면 한가지 문제점이 발생합니다.

작업1과 작업2는 쉬고있는 스레드에 지정되어 작업이 실행중이지만
작업3은 실행할 수 있는 스레드가 없기 때문에 스레드에 할당되지 못하게 됩니다.

즉 작업1 이나 작업2 둘 중 한녀석이 끝나야 작업3이 시작될 수 있는 상황입니다.

이 현상을 스레드 블로킹이 되었다고 합니다.


스레드 블로킹(Thread Blocking)

작업이 완료될 때까지 제어권을 반환하지 않아 호출한 쓰레드가 멈추는 방식을 말합니다.
즉 스레드가 아무것도 하지 못하고 사용될 수 없는 상태입니다.

위 그림에서 작업1, 작업2가 완료에 시간이 얼마나 걸릴지 알 수 없습니다.
예기치 못한 상황이 발생하여 시간이 오래걸린다면 그 만큼 스레드는 Block 되어 아무일을 할 수 없습니다.
위와 같이 작업1이 끝나야 작업 3이 시작되게 됩니다.

만약 작업 1을 수행하는데 작업2의 결과가 필요한 상황이 온다면 작업 1은 작업2가 끝날때 까지 아무것도 하지 못하고 기다려야 하는 상황이 생깁니다.

스레드가 블로킹되면 뭐가 문제인데??

  • 자원의 비효율적 사용: 블로킹 스레드는 CPU를 활용하지 못한 채 대기 상태에 머뭄.

  • 응답 속도 저하: 블로킹으로 처리되면 전체 응답 시간이 길어집니다.

  • 데드락 위험: 블로킹된 스레드가 락을 해제하지 못하는 상황이 발생하면, 다른 스레드도 해당 리소스에 접근하지 못해 데드락이 발생할 수 있습니다.

  • 확장성 문제: 병렬 처리를 제대로 활용하지 못하기 때문에, 스레드 수가 늘어나도 성능이 선형적으로 증가하지 않습니다.

  • 생성 비용과 작업을 전환하는 비용이 비쌈(context switching)


코루틴의 등장

위의 멀티 스레드 프로그래밍의 스레드 블로킹 문제를 해결하기 위해 코루틴이 등장했습니다.

코루틴은 스레드 블로킹 문제를 어덯게 해결할가요?

코루틴은 비동기적 실행과 "일시 중단과 재개"라는 특성을 통해 해결합니다.
코루틴은 작업을 일시 중단(suspend)하고, 다른 코루틴이나 작업으로 전환되며, 작업이 완료되면 재개(resume)하여 이어서 실행합니다.

즉 작업이 중단되면 해당 스레드의 사용 권한을 양보하여 양보된 스레드는 다른 작업을 실행하는데 사용됩니다.
일시 중단된 코루틴은 재개 시점에 다시 스레드에 할당돼 실행됩니다.

! 재개된 작업은 기존에 실행되던 스레드와 다른 스레드일 수 있습니다!

작업1의 결과를 내기 위해서 작업2의 결과가 필요한 상황을 다시 예시로 보겠습니다.
기존의 스레드 블로킹 방법과 달리 작업2가 진행될 동안 Thread1에서 작업1이 중단되고 그동안 작업3를 완료하는 방식으로 바뀌게 됩니다.
코루틴은 이렇게 스레드를 효율적으로 사용합니다.

즉, 작업이 중단되면 스레드 사용 권한을 양보하여 다른 작업을 진행하여 스레드가 블로킹되는 것을 방지하고 스레드에 비해 생성과 전환 비용이 적게 들고 스레드보다 리소스 소비가 적어 경량 스레드라고 불립니다.


코루틴의 특징 및 장점

  • 비동기적 실행

  • 일시 중단과 재개

  • 논 블로킹(스레드를 블로킹하지 않음)

  • 경량 스레드, 동시성 프로그래밍을 효율적이고 간단하게 처리할 수 있는 도구

  • 구조적 동시성 제공(작업의 생명주기를 쉽게 관리, 리소스 누수 방지)

profile
오늘 하루도 화이팅

0개의 댓글