
Coroutine은 세 가지 주요 구성 요소로 이루어져 있다
바로 CoroutineScope, CoroutineContext, 그리고 CoroutineBuilder이다.
코루틴 구성 요소 3가지
- CoroutineScope: 코루틴의 실행 범위를 정의.
- CoroutineContext: 디스패처(Dispatcher)와 잡(Job) 등 코루틴의 실행 환경을 포함.
- CoroutineBuilder: 코루틴을 생성하고 실행하는 빌더(launch, async 등).
그중에서도 CoroutineScope는 코루틴의 실행 범위를 정의하며, 모든 코루틴이 속한 범위를 설정해준다. 이 글에서는 CoroutineScope를 살펴보도록 하겠다.
🌠 CoroutineScope
CoroutineScope
CoroutineScope Defines a scope for new coroutines. Every coroutine builder (like launch, async, etc.) is an extension on CoroutineScope and inherits its coroutineContext to automatically propagate all its elements and cancellation. The best ways to obtain
kotlinlang.org
- CoroutineScope는 새로운 코루틴의 실행 범위를 정의하는 인터페이스이다.
- 모든 코루틴 빌더(launch, async 등)는 CoroutineScope를 확장하며, coroutineContext를 상속받아 자동으로 모든 구성 요소와 취소(cancellation)를 전달한다.
주요 개념
- 코루틴 스코프의 생성:
- 독립적인 코루틴 스코프를 생성하려면 CoroutineScope() 또는 MainScope() 팩토리 함수를 사용한다.
- 스코프가 더 이상 필요하지 않을 때는 이를 명시적으로 취소해야 한다.
- 추가 컨텍스트 요소:
- CoroutineScope에 추가적인 컨텍스트 요소를 + 연산자를 통해 추가할 수 있다.
- 구조적 동시성(Structured Concurrency):
- CoroutineScope의 컨텍스트는 Job 인스턴스를 포함해야 하며, 이를 통해 구조적 동시성을 유지하고 취소(cancellation)를 전파한다.
- 코루틴 빌더(launch, async)와 범위 함수(coroutineScope, withContext)는 모두 고유한 스코프와 Job 인스턴스를 생성하며, 해당 블록 내부의 모든 코루틴이 완료될 때까지 기다린다.
- 이를 통해 구조적 동시성을 보장한다. (이후 포스팅될 Job 부분 추가로 참고하기)
- Android에서의 사용:
- 안드로이드에서는 라이프사이클과 연계된 코루틴 스코프를 지원한다.
- 관련 문서: https://developer.android.com/topic/libraries/architecture/coroutines#lifecyclescope
- For ViewModelScope, use androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0 or higher.
- For LifecycleScope, use androidx.lifecycle:lifecycle-runtime-ktx:2.4.0 or higher.
- For liveData, use androidx.lifecycle:lifecycle-livedata-ktx:2.4.0 or higher.
- 안드로이드에서는 라이프사이클과 연계된 코루틴 스코프를 지원한다.
커스텀 사용법
- CoroutineScope는 명확한 라이프사이클을 가진 엔티티에서 속성(Property)으로 선언하여 자식 코루틴을 관리하도록 해야 한다.
CoroutineScope 생성 방법
- CoroutineScope():
- 전달받은 컨텍스트를 사용하며, 컨텍스트에 Job이 포함되지 않았다면 자동으로 추가한다.
- MainScope():
- 기본적으로 Dispatchers.Main을 사용하며, SupervisorJob을 포함한다.
스코프 취소의 중요성
- 라이프사이클이 끝날 때 CoroutineScope.cancel()을 호출하여 해당 스코프에서 실행 중인 모든 코루틴을 취소해야 한다.
- 이는 남아 있는 코루틴 실행을 중지하고 리소스를 해제하기 위해 필수적이다.
상속된 클래스
- GlobalScope:
- 애플리케이션 전역에서 사용할 수 있는 스코프
- 주의: 구조적 동시성을 제공하지 않으므로 권장되지 않음
- ProducerScope:
- 코루틴 빌더인 produce에서 사용
- ActorScope:
- 액터 코루틴(Actor coroutine)에서 사용됨
주요 속성: coroutineContext
- CoroutineScope의 컨텍스트
- 컨텍스트에는 Job 인스턴스와 Dispatcher가 포함
요약하자면
- CoroutineScope는 코루틴의 활동 범위로 내가 원하는 범위의 스코프를 설정하는 것이다.
- 구조적 동시성을 유지하며, 적절한 시점에 스코프를 취소하여 리소스를 관리해야 한다.
'Kotlin' 카테고리의 다른 글
| [Kotlin/코루틴] CoroutineBuilder와 구성 요소, 한눈에 이해하기 (0) | 2025.01.15 |
|---|---|
| [Kotlin/코루틴] CoroutineContext 중 Job과 Dispatcher 정리하기 (1) | 2025.01.15 |
| [Kotlin/코루틴] Thread vs Coroutine: 차이를 비교 정리해보자! (2) | 2025.01.15 |
| [Kotlin] 입출력 방식 비교와 코딩 테스트 빠른 입출력 최적화 방법 (2) | 2024.12.26 |
| [Kotlin/Java] 코틀린에서 Unit 이해하기 (void 친구): 싱글톤과 타입, 객체의 차이점 (1) | 2024.07.22 |