WakeLock: 정의, 유형 및 절전 잠금 관리

저자: IT Sectr 게시일: 2026-03-28 읽는 시간: 9 분

WakeLock은 CPU 또는 화면을 활성 상태로 유지하여 기기가 절전 모드로 전환되는 것을 방지하는 Android 메커니즘입니다. 파일 다운로드, 오디오 재생 또는 데이터 녹화와 같은 백그라운드 작업은 중단 없이 실행을 보장하기 위해 WakeLock이 필요합니다. Android Developers, 2025 사양에 따르면 WakeLock의 부적절한 사용은 배터리를 빠르게 소모하고 Google Play에서 앱이 차단되는 원인이 될 수 있습니다.

핵심 요약

  • WakeLock — 기기를 활성 상태로 유지하는 절전 잠금
  • 유형 — PARTIAL_WAKE_LOCK, FULL_WAKE_LOCK, SCREEN_DIM_WAKE_LOCK 등
  • 권한 — 매니페스트에 WAKE_LOCK 필요하지만 런타임에 요청되지 않음
  • 위험 — 해제되지 않은 WakeLock은 배터리를 소모하고 사용자 경험을 저하시킴
  • 대안 — WorkManager, Foreground Service, JobScheduler가 WakeLock 필요성을 줄임

WakeLock이란

WakeLock은 Android가 기기를 저전력 모드로 전환하는 것을 방지하는 시스템 잠금입니다. 일반적으로 사용자가 몇 초 동안 조작하지 않으면 Android는 화면을 끄고 CPU를 딥 슬립(deep sleep) 상태로 전환하여 백그라운드 스레드를 중단합니다. WakeLock은 CPU를 활성 상태로 유지하여 이 전환을 방지합니다.

WakeLock 메커니즘은 시스템 서비스인 PowerManager를 통해 관리되며, getSystemService(Context.POWER_SERVICE) 메서드로 액세스합니다. 개발자는 잠금 유형을 지정하여 WakeLock 객체를 생성하고 작업 완료 후 반드시 해제해야 합니다. 그렇지 않으면 기기의 배터리가 빠르게 소모됩니다. 시스템은 WakeLock을 자동으로 해제하지 않습니다 — 이는 앱의 책임입니다.

Android의 주요 릴리스마다 Google은 WakeLock에 대한 제어를 강화하고 있습니다. Android 9(API 28)부터 백그라운드 앱은 정당한 이유 없이 WakeLock을 획득할 수 없으며, 시스템은 잠금을 남용하는 앱을 추적하고 강제로 해제할 수 있습니다. Android 12+에서는 백그라운드 앱의 PowerManager 액세스에 추가 제한이 도입되었습니다.

WakeLock이 필요한 경우

WakeLock은 기기가 절전 모드로 전환되어 작업이 중단되어서는 안 되는 시나리오에서 필요합니다: 불안정한 연결에서 대용량 파일 다운로드, 비디오 녹화, 사용자 상호작용 없이 장시간 계산 수행. 절전 잠금이 없으면 CPU가 딥 슬립에 들어가고 모든 스레드가 중단되며 작업이 완료되지 않은 상태로 남습니다.

그러나 Google은 WakeLock 사용을 최소화할 것을 강력히 권장합니다. 대부분의 경우 동일한 작업은 알림이 있는 Foreground Service, WorkManager 또는 JobScheduler로 해결할 수 있습니다. 이러한 메커니즘은 배터리 및 네트워크 상태를 고려하여 기기의 배터리 수명을 연장합니다.

WakeLock의 작동 방식

WakeLock은 기기의 전원 상태를 관리하는 PowerManager 시스템 서비스를 통해 작동합니다. 앱이 powerManager.newWakeLock()을 통해 잠금을 요청하면 시스템이 CPU 활동 수준을 높여 딥 슬립을 방지합니다. wakeLock.release()를 호출한 후 시스템은 정상적인 절전 모드로 돌아갑니다.

WakeLock이 모든 절전 모드를 방지하지는 않는다는 점을 이해하는 것이 중요합니다. Doze 모드(Android 6+의 절전 모드)는 특정 단계에서 WakeLock을 무시할 수 있습니다 — WakeLock을 유지하는 앱은 Doze 유지 관리 기간 동안 네트워크 액세스를 얻을 수 없습니다. 즉, 활성 WakeLock이 있어도 Doze의 두 번째 단계에서 네트워크 작업이 보장되지 않습니다.

각 WakeLock은 프레임워크 측의 PowerManager.WakeLock과 연결됩니다. 시스템은 프로세스 수준에서 활성 잠금을 계산합니다: 하나의 프로세스가 여러 WakeLock을 유지하면 누적되며 각 잠금에 대해 release()를 호출한 후에만 해제됩니다. Android는 웨이크 록 타임아웃도 지원합니다 — 지정된 간격 후 자동 해제입니다. 그러나 타임아웃에 의존하는 것은 권장되지 않습니다: 작업이 더 일찍 완료될 수 있으며 추가 유지 시간이 배터리 수명을 단축시킵니다.

WakeLock과 시스템 이벤트

기기가 절전 모드로 전환되면(전원 버튼) Android는 모든 SCREEN_DIM_WAKE_LOCKSCREEN_BRIGHT_WAKE_LOCK을 강제로 해제하지만 PARTIAL_WAKE_LOCK은 유지합니다. 즉, 화면 잠금은 디스플레이를 켜진 상태로 유지할 수 없으며 PARTIAL_WAKE_LOCK만이 전원 버튼을 누른 후에도 계속 작동할 수 있습니다.

Android에서 WakeLock의 유형

Android에는 여러 유형의 WakeLock이 있으며, 각각 특정 기기 구성 요소를 제어합니다. 유형 선택은 잠금 후 어떤 하드웨어 구성 요소가 활성 상태로 유지되는지를 결정합니다. 잘못된 유형을 선택하면 불필요한 모듈이 켜진 상태로 유지되어 과도한 전력 소비가 발생합니다.

유형CPU화면키보드사용 시기
PARTIAL_WAKE_LOCK켜짐꺼짐꺼짐파일 다운로드, 계산
SCREEN_DIM_WAKE_LOCK켜짐어두움꺼짐비디오 플레이어, 프레젠테이션
SCREEN_BRIGHT_WAKE_LOCK켜짐밝음꺼짐게임(사용 중단됨)
FULL_WAKE_LOCK켜짐밝음밝음사용 중단됨(deprecated)

PARTIAL_WAKE_LOCK — 주요 유형

PARTIAL_WAKE_LOCK은 가장 많이 사용되고 권장되는 유형입니다. CPU를 활성 상태로 유지하지만 화면과 키보드 백라이트는 끌 수 있습니다. 이는 백그라운드 작업(데이터 로딩, 이미지 처리, 동기화)에 최적의 선택입니다. 화면은 시스템 타임아웃 후 꺼져 사용자에게 보이지 않는 작업을 수행하면서 배터리를 절약합니다.

사용 중단된 유형(deprecated)

SCREEN_DIM_WAKE_LOCK, SCREEN_BRIGHT_WAKE_LOCKFULL_WAKE_LOCK은 Android 7(API 24)부터 사용이 중단되었습니다. 이들은 화면을 켜진 상태로 유지하여 상당한 배터리 소비를 초래합니다. Google은 대신 Activity.getWindow().addFlags()를 통한 FLAG_KEEP_SCREEN_ON 사용을 권장합니다 — 이 플래그는 Activity가 활성화된 경우에만 작동하며 WAKE_LOCK 권한이 필요하지 않고 시스템이 화면 유지 시간을 자동으로 관리합니다.

WakeLock과 전력 소비

WakeLock은 Android에서 배터리 소모의 주요 원인 중 하나입니다. 절전 잠금이 유지되는 매초 CPU가 에너지 효율적인 C-state로 전환할 수 없기 때문에 추가 전력을 소비합니다. Google Power Dashboard 연구에 따르면 WakeLock을 적절히 해제하지 않은 앱은 대기 모드에서 기기의 전력 소비를 30~50%까지 증가시킬 수 있습니다.

시스템은 Battery Historian 구성 요소를 통해 WakeLock을 남용하는 앱을 추적합니다. 개발자는 전력 소비 프로필을 분석하고 잠금 누수(WakeLock이 생성되었지만 해제되지 않은 상황)를 식별할 수 있습니다. Google Play Console은 게시된 앱의 WakeLock 통계를 표시하며, 유지 시간이 길면 사용자 평가가 나빠질 수 있습니다.

Doze 모드App Standby는 WakeLock 작동을 추가로 제한합니다. 첫 번째 Doze 단계(Light Doze)에서는 시스템이 짧은 유지 관리 기간에 WakeLock을 허용합니다. 두 번째 단계(Deep Doze)에서는 WakeLock이 다른 잠금과 병합되어 공통 기간에 실행됩니다. 앱이 사용자 상호작용 없이 10분 이상 WakeLock을 유지하면 시스템이 강제로 해제하고 앱을 배터리 최적화 블랙리스트에 추가할 수 있습니다.

  • Battery Historian — 전력 소비 및 WakeLock 누수 분석 도구
  • Doze 모드 — 유지 관리 기간에 WakeLock 제한, 잠금 병합
  • Google Play Console — 게시된 앱의 WakeLock 통계 표시
  • 블랙리스트 — 앱이 시스템에 의해 전력 소모가 많은 것으로 표시될 수 있음

사용 모범 사례

WakeLock의 올바른 사용은 작업 완료 필요성과 기기 배터리 관리 간의 균형입니다. Google은 몇 가지 원칙을 따를 것을 권장합니다: 항상 finally 블록 또는 acquire(timeout)을 통해 WakeLock 해제, 최소 필요 잠금 유형 사용, 극히 필요한 경우가 아니면 장기간 유지 피하기.

해제 규칙

WakeLock은 생성된 동일한 코드 블록에서 해제해야 합니다. 예외 발생 시 해제를 보장하기 위해 try-finally 구문 또는 Kotlin의 use 블록을 사용합니다. Android 10+에서 WakeLock이 60초 이상 유지되면 시스템이 logcat에 경고를 표시합니다: "WakeLock held for more than 60 seconds" — 이는 누수 가능성을 나타냅니다.

획득 타임아웃

acquire(long timeout) 메서드는 지정된 밀리초 후에 WakeLock을 자동으로 해제합니다. 이는 예외나 버그로 인해 해제 코드가 실행되지 않는 경우를 대비한 안전 장치입니다. 항상 최대 예상 작업 실행 시간에 10~20%의 여유를 더한 타임아웃을 지정하는 것이 좋습니다.

잠금 상태 확인

release()를 호출하기 전에 WakeLock이 현재 유지되고 있는지 확인해야 합니다. 사전 acquire() 없이 다시 release()를 호출하면 RuntimeException: WakeLock under-locked이 발생합니다. 상태 플래그(isHeld)를 저장하고 해제 전에 wakeLock.isHeld()를 확인하는 것이 좋습니다.

Kotlin에서 WakeLock 사용

Kotlin에서 WakeLock의 올바른 생성 및 해제를 살펴보겠습니다. 예제는 PARTIAL_WAKE_LOCK을 유지한 비동기 데이터 로딩, try-finally 블록에서의 보장된 해제 및 누수 방지를 위한 타임아웃 지정을 보여줍니다. 서비스는 백그라운드 작업 실행을 위해 IO 디스패처와 함께 CoroutineScope를 사용합니다.

kotlin
class DownloadService : Service() {

    private lateinit var wakeLock: PowerManager.WakeLock
    private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())

    override fun onCreate() {
        super.onCreate()
        val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
        wakeLock = powerManager.newWakeLock(
            PowerManager.PARTIAL_WAKE_LOCK,
            "download:wakelock"
        )
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        wakeLock.acquire(60000)
        scope.launch {
            try {
                downloadFile()
            } finally {
                if (wakeLock.isHeld()) {
                    wakeLock.release()
                }
            }
        }
        return START_NOT_STICKY
    }

    private suspend fun downloadFile() {
        // 파일 다운로드 시뮬레이션
        delay(30000)
    }

    override fun onDestroy() {
        super.onDestroy()
        scope.cancel()
        if (wakeLock.isHeld()) {
            wakeLock.release()
        }
    }

    override fun onBind(intent: Intent): IBinder? = null
}

매니페스트에서 권한 선언

WakeLock을 사용하려면 AndroidManifest.xml에 권한을 추가해야 합니다. WAKE_LOCK 권한은 일반 권한으로, 사용자에게 런타임 요청이 필요하지 않으며 앱 설치 시 자동으로 부여됩니다. 그러나 앱에 WakeLock의 명확한 사용 사례가 없으면 Google Play에서 게시를 거부할 수 있습니다.

xml
<uses-permission
    android:name="android.permission.WAKE_LOCK" />

<uses-permission
    android:name="android.permission.DEVICE_POWER" />

WakeLock의 대안

WakeLock은 저수준 메커니즘이며 Google은 가능한 경우 더 현대적인 API로 대체할 것을 권장합니다. 주요 대안은 알림이 있는 Foreground Service로, 서비스 기간 동안 자동으로 CPU 잠금을 유지합니다. 시스템이 Foreground Service의 WakeLock을 직접 관리하므로 개발자는 명시적인 획득 및 해제에서 자유로워집니다.

WorkManager는 백그라운드 작업을 위한 두 번째로 중요한 도구입니다. 기기가 Doze 모드로 전환된 후와 재부팅 후에도 작업 실행을 보장합니다. WorkManager는 내부적으로 홀드 록(hold lock)을 지원합니다 — 개발자가 PowerManager를 명시적으로 조작할 필요가 없습니다. 작업은 자동 절전 잠금 관리와 함께 Doze 유지 관리 기간에 실행됩니다.

정확한 시간이 필요한 반복 작업에는 setAndAllowWhileIdle()과 함께 AlarmManager를 사용하여 기기를 Doze에서 깨울 수 있습니다. 그러나 AlarmManager는 짧은 작업에만 적합합니다 — 장기간 WakeLock 유지를 위해 설계되지 않았습니다. 작업이 10초 이상 걸리는 경우 AlarmManager를 Foreground Service를 시작하는 BroadcastReceiver와 결합하세요.

  • Foreground Service — 알림과 함께 자동 WakeLock 관리
  • WorkManager — Doze 및 재부팅 인식과 함께 보장된 실행
  • JobScheduler — 네트워크, 충전 및 유휴 상태를 고려한 스케줄링
  • AlarmManager — 짧은 예약 작업을 위해 기기 깨우기

자주 묻는 질문

Android에서 WakeLock이란 무엇인가요

WakeLock은 Android 기기가 절전 모드로 전환되는 것을 방지하는 시스템 잠금입니다. CPU 또는 화면을 활성 상태로 유지하여 백그라운드 작업(다운로드, 계산)이 중단 없이 실행될 수 있도록 합니다. PowerManager 시스템 서비스를 통해 관리됩니다.

WakeLock에는 어떤 유형이 있나요

주요 유형은 다음과 같습니다: PARTIAL_WAKE_LOCK(CPU 활성, 화면 꺼짐) — 권장; SCREEN_DIM_WAKE_LOCK(CPU + 어두운 화면); SCREEN_BRIGHT_WAKE_LOCK(CPU + 밝은 화면). SCREEN_DIM, SCREEN_BRIGHT 및 FULL_WAKE_LOCK은 사용이 중단되었고 FLAG_KEEP_SCREEN_ON으로 대체되었습니다.

WakeLock에 권한이 필요한가요

네, 매니페스트에서 android.permission.WAKE_LOCK을 선언해야 합니다. 이는 일반 권한으로 설치 시 자동으로 부여되며 런타임 요청이 필요하지 않습니다. 이 권한이 없으면 newWakeLock() 호출이 null을 반환하거나 SecurityException을 발생시킵니다.

WakeLock을 해제하지 않으면 어떻게 되나요

release()를 호출하지 않으면 기기가 절전 모드로 전환될 수 없습니다. 배터리가 훨씬 빨리 소모됩니다(최대 50% 추가 소비). 시스템이 logcat에 누수를 기록하고 Battery Historian이 비정상적인 WakeLock 유지 시간을 표시하여 사용자 평가가 나빠집니다.

최신 앱에서 WakeLock을 대체할 수 있는 것은 무엇인가요

긴 작업의 경우 알림이 있는 Foreground Service를 사용하세요 — 시스템이 WakeLock을 직접 관리합니다. 지연 및 보장된 작업의 경우 내부적으로 WakeLock을 지원하는 WorkManager를 사용하세요. 짧은 예약 작업의 경우 AlarmManager를 사용하세요.

요약

  • WakeLock — Android 기기의 CPU 또는 화면을 활성 상태로 유지하는 절전 잠금
  • PARTIAL_WAKE_LOCK — 백그라운드 작업용 주요 유형; 화면 꺼짐, CPU 활성 유지
  • 권한 — 매니페스트의 WAKE_LOCK(일반 권한, 런타임 불필요)
  • 누수 — 해제되지 않은 WakeLock이 배터리를 30~50% 소모; finally 또는 타임아웃으로 해제
  • 사용 중단 — SCREEN_DIM, SCREEN_BRIGHT 및 FULL_WAKE_LOCK이 FLAG_KEEP_SCREEN_ON으로 대체됨
  • Foreground Service — 자동 WakeLock 관리 및 알림이 있는 대안
  • WorkManager — 보장된 실행이 필요한 지연 백그라운드 작업에 가장 적합

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기