UI 화면 없이 백그라운드에서 장시간 작업을 수행하는 서비스(Service) 컴포넌트와 Foreground Service, 그리고 WorkManager를 다룹니다.
1. 서비스 3가지 유형
- Foreground Service: 사용자에게 상단 알림을 의무 노출하고 높은 우선순위로 장시간 실행되는 백그라운드 서비스입니다.
- Background Service: 사용자에게 직접 보이지 않는 연산을 수행합니다.
- Bound Service: 액티비티와 바인딩되어 데이터 주고받기 인터페이스를 제공하는 서비스입니다.
2. WorkManager 등록 예제
class LogWorker(ctx: Context, params: WorkerParameters) : Worker(ctx, params) {
override fun doWork(): Result {
Log.d("WorkManager", "백그라운드 동기화 수행 중...")
return Result.success()
}
}
val request = OneTimeWorkRequestBuilder<LogWorker>().build()
WorkManager.getInstance(applicationContext).enqueue(request)
5. 안드로이드 & 코틀린 실무 심화 개발 가이드 및 엔터프라이즈 최적화 (Deep Dive)
본 15. 서비스 컴포넌트 - Foreground Service, Bound Service 및 WorkManager 비동기 작업 레슨에서 다룬 핵심 이론 및 구현 패턴은 대규모 상용 모바일 앱 제작 시 앱의 안정성과 응답 속도(Performance), 메모리 사용량을 결정하는 주요 엔지니어링 팩터입니다.
1) 아키텍처 및 메모리 관리 지침 (Architecture & Memory Rules)
- 메모리 누수(Memory Leak) 방지 및 Context 참조 경계: Activity나 Fragment의 Context 객체를 장기간 유지되는 싱글톤 클래스나 Static 포인터에 저장해서는 안 됩니다. 전역 앱 정보가 필요한 경우 반드시
ApplicationContext를 전달하십시오. - 뷰 바인딩(ViewBinding) 및 리사이클러뷰(RecyclerView) 참조 해제: 프래그먼트 생명주기 상
onDestroyView()호출 시점에_binding = null을 지정하여 UI 계층의 메모리 참조 고리를 즉시 끊어주어야 메모리 릭을 방지할 수 있습니다. - 코루틴(Coroutines) 스레드 풀 분리 메커니즘:
- UI 렌더링 및 뷰 상태 변경:
Dispatchers.Main - I/O 통신, 파일 읽기/쓰기, Room DB 쿼리, 네트워크 REST API 호출:
Dispatchers.IO - 대용량 데이터 정렬, 딥러닝/이미지 가공 연산:
Dispatchers.Default
- UI 렌더링 및 뷰 상태 변경:
2) 앱 보안 및 구글 플레이 스토어 배포 지침 (Security & Publishing)
- 동적 런타임 권한(Runtime Permissions) 관리: 위치 정보, 카메라, 마이크 권한 요청 시 앱 시작 즉시 허용을 요구하는 방식 대신, 해당 기능이 실행되는 접점에서 사유 설명 다이얼로그와 함께 동적 요청을 시행합니다.
- 코드 난독화 및 최적화(R8 / ProGuard):
build.gradle.kts내isMinifyEnabled = true설정을 통해 사용하지 않는 코드를 제거(Tree-shaking)하고 소스 코드를 난독화하여 역공학(Reverse Engineering) 피해를 차단합니다. - API Key 및 서명 키 분리 보안: 비밀 API Key, Firebase 키는 프로젝트의
local.properties파일에 은닉 보관하고,BuildConfig를 통해 수신함으로써 공개 버전 관리(Git)에 누출되지 않도록 엄격히 방어합니다.
6. 핵심 요약 및 실무 FAQ (Summary & Q&A)
Q1. 본 챕터의 기능을 실제 프로젝트에 구동할 때 가장 자주 발생하는 대표적 오류는 무엇인가요?
- 안드로이드 메인 UI 스레드에서 무거운 네트워크 통신이나 DB 읽기/쓰기를 직렬 수행하다가
NetworkOnMainThreadException예외가 발생하거나 화면이 멈추는 ANR(Application Not Responding) 현상이 일어나는 것입니다. 반드시viewModelScope나withContext(Dispatchers.IO)를 통해 비동기 처리해야 합니다.
Q2. 신규 앱 프로젝트 구축 시 기존 구버전 사양 대신 최신 Jetpack 라이브러리를 도입하는 이점은 무엇인가요?
- 구버전의
findViewById나AsyncTask등은 널 안전성이 보장되지 않고 생명주기(Lifecycle) 변화에 취약하여 앱이 비정상 종료(Crash)될 확률이 높습니다. 최신 Android Jetpack(ViewBinding, Coroutines, Room, WorkManager)을 채택하면 가독성과 타입 안정성, 보일러플레이트 코드의 80% 이상 감소 효과를 누릴 수 있습니다.