반드시 CoroutineScope를 직접 써야 하는 예시 (공식문서 기반)
상황 lifecycleScope/viewModelScope 사용 불가 이유 반드시 CoroutineScope 직접 써야
하는 이유
1. Repository 등 "ViewModel이 아닌" 객체 | lifecycleScope/viewModelScope는 Activity, ViewModel에만 있음 | 자체적으로 스코프 관리 필요 |
2. 라이브러리 개발 (외부에 의존성 없이) | 앱 구조에 종속되면 안 됨 | 독립적으로 코루틴 관리 필요 |
3. 백그라운드 서비스/포그라운드 서비스 | Service에는 lifecycleScope/viewModelScope 없음 | 서비스 종료/중지 시점에 직접 해제 필요 |
4. 단독 실행 오브젝트/싱글턴 패턴 | 안드로이드 컴포넌트와 연결 불가 | 오브젝트 자체 생명주기와 묶어서 코루틴 사용 |
5. 커스텀 클래스/매니저 객체 | 별도의 라이프사이클이 필요함 | 클래스 종료/정리 시점에 직접 해제 필요 |
1. Repository 등 ViewModel, Activity와 무관한 객체에서 코루틴 사용
// Repository 예시 (공식문서 예시 기반)
class MyRepository : CoroutineScope by CoroutineScope(Dispatchers.IO) {
fun fetchData() {
launch {
// 네트워크나 DB 작업
}
}
fun clear() {
cancel() // ★ 직접 해제 (주석: 직접 해제해야 함)
}
}
설명:
Repository 객체는 Activity, ViewModel과 연결되지 않아
lifecycleScope, viewModelScope 사용 불가.
직접 CoroutineScope 생성·해제 필요.
2. 라이브러리(외부 의존성 없는) 클래스에서 비동기 처리
// 라이브러리/모듈에서 독립적 실행이 필요한 경우
class FileUploader : CoroutineScope by CoroutineScope(Dispatchers.IO) {
fun upload(file: File) {
launch {
// 파일 업로드 작업
}
}
fun release() {
cancel() // ★ 직접 해제 (주석: 직접 해제해야 함)
}
}
설명:
라이브러리/모듈은 Activity, ViewModel 의존성이 없어야 하므로
CoroutineScope 직접 사용 및 해제 필요.
3. 백그라운드 서비스(Service)에서 작업 처리
// Service 내부에서
class MyBackgroundService : Service(), CoroutineScope by CoroutineScope(Dispatchers.Default) {
override fun onCreate() {
super.onCreate()
launch {
// 백그라운드 작업
}
}
override fun onDestroy() {
cancel() // ★ 직접 해제 (주석: 서비스 종료 시 직접 해제)
super.onDestroy()
}
}
- 설명:
Service에는 lifecycleScope, viewModelScope 제공되지 않으므로
직접 CoroutineScope 생성 및 해제 필요.
Kotlin 코루틴으로 앱 성능 향상 | Android Developers
이 페이지는 Cloud Translation API를 통해 번역되었습니다. Kotlin 코루틴으로 앱 성능 향상 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Kotlin 코루틴 명확하고
developer.android.com
4. 싱글턴 오브젝트/매니저에서 관리
// 싱글턴 오브젝트에서
object MySingletonManager : CoroutineScope by CoroutineScope(Dispatchers.IO) {
fun doTask() {
launch {
// 싱글턴 비동기 작업
}
}
fun clear() {
cancel() // ★ 직접 해제 (주석: 앱 종료 등 필요 시 해제)
}
}
5. 커스텀 객체/특정 기능 매니저 클래스에서 사용
// 커스텀 매니저 클래스
class DownloadManager : CoroutineScope by CoroutineScope(Dispatchers.IO) {
fun startDownload(url: String) {
launch {
// 다운로드 실행
}
}
fun stopAll() {
cancel() // ★ 직접 해제 (주석: 사용자가 명시적으로 중단 요청 시)
}
}
설명:
사용자의 명시적 요청 등으로 비동기 작업을 중단해야 할 때
클래스 자체가 직접 스코프 해제 필요.
스코프 사용 이유 해제 필요성
Repository | Activity/ViewModel과 무관 | 직접 cancel() |
라이브러리 | 앱 구조 독립성 | 직접 cancel() |
Service | lifecycleScope 미제공 | 직접 cancel() |
싱글턴 | 앱 전체 공용 관리 | 직접 cancel() |
커스텀 매니저 | 별도 객체 필요 | 직접 cancel() |
상황 권장스코프 이유
액티비티/프래그먼트 | lifecycleScope | 화면 종료 시 자동 해제 |
ViewModel | viewModelScope | ViewModel 종료 시 자동 해제 |
그 외(직접 만든 객체 등) | CoroutineScope | 직접 관리 필요, 명확한 책임자가 있을 때만 사용 |