안드로이드 개발/개발팁

반드시 CoroutineScope를 직접 써야 하는 예시 (공식문서 기반)

Aiden96 2025. 7. 17. 09:07

 

상황 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 생성 및 해제 필요.

공식문서: Service와 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 직접 관리 필요, 명확한 책임자가 있을 때만 사용