0Pricing
Android Academy · 강의

CameraX 개요

기존 카메라 API보다 CameraX를 사용해야 하는 이유를 알아봅니다.

CameraX 개요은(는) CoddyKit의 무료 Android Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Android Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Android Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

CameraX를 사용하는 이유

Android 앱에 카메라를 추가하는 작업은 예전에는 매우 까다로웠습니다. 기존 android.hardware.camera2 API는 강력하지만 코드가 지나치게 장황하고, 시중에 있는 수천 가지 기기에서 동작 방식도 서로 달랐습니다.

CameraX는 Camera2 위에서 동작하는 Jetpack 라이브러리로, 간단하고 수명 주기를 인식하며 일관된 API를 제공합니다. 이 과정에서는 CameraX를 사용해 실시간 미리보기를 표시하고, 사진을 촬영하고, 동영상을 녹화합니다.

CameraX가 해결하는 문제

CameraX는 다음 세 가지 목표를 중심으로 설계되었습니다.

  • 쉬운 사용 — Camera2보다 반복 작성해야 하는 코드가 훨씬 적습니다.
  • 일관성 — Google이 대규모 기기 테스트 환경에서 검증하므로 특이한 기기에서도 예측 가능하게 동작합니다.
  • 수명 주기 인식 — 카메라가 화면의 수명 주기에 따라 자동으로 시작하고 중지되므로 카메라 리소스가 누수되지 않습니다.

원하는 내용(미리보기, 사진, 동영상)을 설명하면 CameraX가 현재 기기에서 이를 처리하는 방법을 결정합니다.

세 가지 핵심 사용 사례

CameraX는 사용 사례를 중심으로 구성됩니다. 사용 사례란 카메라 기능을 독립적으로 수행하는 구성 요소입니다. 주요 사용 사례는 다음 세 가지입니다.

  • Preview — 카메라가 보는 화면을 표시합니다.
  • ImageCapture — 사진을 촬영합니다.
  • VideoCapture — 동영상을 녹화합니다.

필요한 사용 사례를 만들고 서로 연결한 다음 카메라에 바인딩합니다.

// You create the use cases you need:
val preview = Preview.Builder().build()
val imageCapture = ImageCapture.Builder().build()
// Later you bind them to a lifecycle and a camera.

종속 항목 추가

CameraX는 여러 아티팩트로 제공됩니다. 이를 모듈의 build.gradle.kts에 추가합니다. 일반적인 설정에서는 핵심 라이브러리, camera2 백엔드, 수명 주기 통합 기능 및 뷰 도우미를 포함합니다.

충돌을 피하려면 모든 CameraX 아티팩트에 동일한 버전을 사용해야 합니다.

dependencies {
    val cameraxVersion = "1.3.4"
    implementation("androidx.camera:camera-core:$cameraxVersion")
    implementation("androidx.camera:camera-camera2:$cameraxVersion")
    implementation("androidx.camera:camera-lifecycle:$cameraxVersion")
    implementation("androidx.camera:camera-view:$cameraxVersion")
    implementation("androidx.camera:camera-video:$cameraxVersion")
}

권한 선언

카메라를 사용하려면 AndroidManifest.xml에 CAMERA 권한을 선언해야 합니다. 동영상도 녹화한다면 RECORD_AUDIO가 필요할 수 있습니다.

이 권한들은 실행 중 권한입니다. 선언하는 것만으로는 충분하지 않으며, 실행 중에 사용자에게 별도로 요청해야 합니다(이 내용은 이후 강의에서 다룹니다).

<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-feature
    android:name="android.hardware.camera.any"
    android:required="false" />

CameraProvider

CameraX의 진입점은 ProcessCameraProvider입니다. 이 구성 요소는 사용 사례를 카메라 및 화면의 수명 주기에 연결합니다.

getInstance()를 사용해 비동기 방식으로 가져오며, 이 메서드는 ListenableFuture를 반환합니다. Kotlin에서는 코루틴 내부에서 await()할 수 있습니다.

import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.camera.core.ExperimentalGetImage

suspend fun Context.getCameraProvider(): ProcessCameraProvider {
    return ProcessCameraProvider.getInstance(this).await()
}

사용 사례를 수명 주기에 바인딩하기

프로바이더를 가져온 후에는 사용 사례를 LifecycleOwner와 CameraSelector(전면 또는 후면 카메라)에 바인딩합니다.

바인딩은 수명 주기를 인식하므로 CameraX가 화면이 표시될 때 카메라를 자동으로 열고, 화면이 표시되지 않을 때 닫습니다. 수동으로 정리할 필요가 없습니다.

val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA

cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
    lifecycleOwner,
    cameraSelector,
    preview,
    imageCapture
)

카메라 선택하기

CameraSelector는 CameraX가 사용할 실제 카메라를 지정합니다. 가장 흔히 사용하는 카메라는 기본 후면 카메라와 기본 전면 카메라입니다.

특정 특성을 요구하는 맞춤 선택기를 만들 수도 있지만, 기본 설정만으로 거의 모든 앱을 구현할 수 있습니다.

// Back camera (most common for photos)
val back = CameraSelector.DEFAULT_BACK_CAMERA

// Front camera (selfies, video calls)
val front = CameraSelector.DEFAULT_FRONT_CAMERA

// Toggle between them by swapping the selector and re-binding.

PreviewView: 표시 화면

CameraX는 실시간 미리보기를 PreviewView에 렌더링합니다. PreviewView는 표면, 크기 조정 및 회전을 자동으로 처리하는 일반 Android View입니다.

Jetpack Compose에서는 AndroidView를 사용해 이를 포함합니다. 그러면 컴포저블 내부에 기존 View를 배치할 수 있습니다. 다음 강의에서 전체 연결 방법을 살펴봅니다.

AndroidView(
    factory = { context ->
        PreviewView(context).apply {
            scaleType = PreviewView.ScaleType.FILL_CENTER
        }
    },
    modifier = Modifier.fillMaxSize()
)

실제로 적용하는 수명 주기 인식

CameraX의 가장 큰 실용적 장점은 수명 주기를 인식한다는 점입니다. Camera2를 사용할 때는 onResume에서 카메라를 수동으로 열고 onPause에서 해제해야 했으며, 이를 잊으면 충돌이 발생하거나 카메라가 멈출 수 있었습니다.

CameraX에서는 bindToLifecycle하기만 하면 프레임워크가 이 모든 작업을 처리합니다. 사용자가 다른 화면으로 이동하면 카메라가 자동으로 해제되고, 돌아오면 다시 열립니다.

// No manual open/close needed.
// bindToLifecycle ties the camera to the screen's
// lifecycle, so it follows onStart/onStop for you.
cameraProvider.bindToLifecycle(lifecycleOwner, selector, preview)

개념적 모델

이 과정의 나머지 부분에서도 다음 흐름을 기억해 두세요.

  • ProcessCameraProvider를 가져옵니다.
  • 필요한 사용 사례(Preview, ImageCapture, VideoCapture)를 만듭니다.
  • CameraSelector를 선택합니다.
  • bindToLifecycle하여 모든 요소를 연결합니다.

CameraX의 모든 기능은 이 네 단계를 변형한 것입니다.

빠른 확인

CameraX의 기본 개념을 얼마나 이해했는지 확인해 보세요.

복습

이제 CameraX의 전체 구조를 이해했습니다.

  • CameraX는 Camera2를 더 간단하고 일관되며 수명 주기를 인식하는 API로 감쌉니다.
  • 사용 사례인 Preview, ImageCapture, VideoCapture를 중심으로 구성됩니다.
  • CameraX 아티팩트를 추가하고, CAMERA 권한을 선언하고, ProcessCameraProvider를 가져온 다음 bindToLifecycle합니다.
  • CameraSelector가 전면 카메라와 후면 카메라 중 하나를 선택하고, PreviewView가 영상을 표시합니다.

다음으로 실제 실시간 미리보기를 화면에 연결해 보겠습니다.

자주 묻는 질문

“CameraX 개요” 강의는 무료인가요?

네 — “CameraX 개요” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Android Academy 강의 전체를 잠금 해제할 수 있습니다. Android Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“CameraX 개요”에서 뭘 배우나요?

기존 카메라 API보다 CameraX를 사용해야 하는 이유를 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 Android Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Android Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Android Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“CameraX 개요” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Android Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Android Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. CameraX 개요
  2. 카메라 미리보기 표시
  3. 사진 촬영
  4. 동영상 녹화
← Android Academy(으)로 돌아가기