모바일 애플리케이션의 카메라는 시스템 API를 통해 개발자가 이미지와 비디오를 캡처할 수 있는 장치의 하드웨어 모듈입니다. Google Android Developers (2025)에 따르면, CameraX는 카메라 기능이 필요한 Android 애플리케이션의 85% 이상에서 사용됩니다. iOS의 AVFoundation과 Android의 CameraX는 하드웨어 관리의 복잡성을 숨기는 고수준 인터페이스를 제공합니다.
주요 포인트
모바일 카메라는 렌즈, 이미지 센서 및 이미지 신호 프로세서(ISP)로 구성된 통합 광학 모듈입니다. 개발자는 특수 프레임워크를 사용하여 운영 체제를 통해 카메라에 액세스합니다. Android에서는 Camera2 API(저수준)와 CameraX(고수준, Camera2 기반)가 있고, iOS에서는 AVFoundation과 간단한 시나리오를 위한 UIKit이 있습니다. 각 플랫폼은 자체 도구 세트를 제공하지만 기본 개념은 동일합니다: 애플리케이션이 캡처 세션을 초기화하고, 매개변수(해상도, 초점, 노출)를 구성하며, 프레임 스트림 또는 개별 이미지를 수신합니다.
최신 모바일 카메라는 많은 촬영 모드를 지원합니다: HDR, 야간 모드, 배경 흐림 효과의 인물 사진, 슬로우 모션 비디오 및 RAW 형식 녹화. 개발자는 소프트웨어 설정(ISO(센서 감도), 셔터 속도(노출), 화이트 밸런스, 초점(자동 및 수동), 이미지 안정화)에 액세스할 수 있습니다. 플래그십 기기에는 다양한 초점 거리의 최대 4개 카메라가 있을 수 있으며, 애플리케이션은 ID로 특정 카메라를 선택할 수 있습니다.
모바일 플랫폼은 카메라 작업을 위한 여러 API를 제공하며, 추상화 수준과 기능이 다릅니다. 특정 API의 선택은 프로젝트 요구 사항에 따라 달라집니다: 간단한 사진 캡처에는 CameraX 또는 UIImagePickerController로 충분합니다; 전문적인 애플리케이션에는 센서를 직접 제어하는 Camera2 또는 AVFoundation이 필요합니다. 아래는 주요 API의 비교입니다.
| API | 플랫폼 | 수준 | 특징 |
|---|---|---|---|
| CameraX | Android | 높음 | 수명 주기 인식, 95% 기기 |
| Camera2 | Android | 낮음 | 완전 제어, RAW, 버스트 |
| AVFoundation | iOS | 중간 | 완전한 캡처 제어 |
| UIKit (UIImagePickerController) | iOS | 높음 | 준비된 UI, 사용자 정의 불가 |
CameraX는 깊은 사용자 정의 없이 카메라가 필요한 대부분의 Android 애플리케이션에 최적의 선택입니다. 라이브러리는 Activity 및 Fragment 수명 주기를 자동으로 처리하고, 권한을 지원하며, 다양한 Android 버전 간의 호환성을 보장합니다. CameraX는 호환성 레이어 덕분에 95%의 Android 기기에서 일관된 동작을 보장합니다. 카메라 미리보기(Preview), 사진 캡처(ImageCapture) 또는 프레임 분석(ImageAnalysis)이 필요한 경우 — CameraX는 복잡한 코드를 작성하지 않고도 세 가지 시나리오를 모두 처리합니다.
Camera2는 전문적인 시나리오를 위한 저수준 API입니다: RAW 녹화, 수동 노출 조정, 버스트 캡처, 여러 카메라 동시 제어. Camera2를 사용하려면 개발자가 이미지 캡처 파이프라인, 상태 머신 관리 및 콜백 처리에 대한 깊은 이해가 필요합니다. Camera2는 CameraX가 요구 사항을 충족하지 못하는 경우에만 사용하세요: 예를 들어, 수동 초점이 필요한 문서 스캔 애플리케이션이나 비표준 해상도의 사용자 정의 카메라 등입니다.
카메라에 대한 액세스는 두 플랫폼 모두에서 사용자의 명시적 허가가 필요합니다. Android에서는 CAMERA 권한을 매니페스트에 추가하고, Android 6.0부터는 런타임에 ActivityCompat.requestPermissions를 통해 권한을 요청해야 합니다. iOS에서는 Info.plist에 NSCameraUsageDescription 키를 추가하고 카메라 사용 이유를 설명합니다. 이 설명이 없으면 카메라에 액세스하려고 할 때 애플리케이션이 충돌합니다. iOS 14부터 권한 대화상자에는 애플리케이션 이름뿐만 아니라 지정된 이유도 표시됩니다—문구는 사용자가 이해할 수 있어야 합니다.
CameraX는 카메라 작업을 몇 줄의 코드로 단순화합니다. 미리보기를 시작하려면 Preview 인스턴스를 생성하고, LifecycleOwner에 바인딩하며, 표시를 위한 SurfaceProvider를 얻어야 합니다. 사진 캡처에는 저장 대상을 지정한 ImageCapture를 사용합니다. 아래는 Kotlin에서 CameraX를 사용하여 카메라를 시작하고 사진을 촬영하는 전체 예제입니다.
val preview = Preview.Builder()
.build()
.also {
it.surfaceProvider = viewFinder.surfaceProvider
}
val imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.build()
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener(Runnable {
val cameraProvider = cameraProviderFuture.get()
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
try {
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
this, cameraSelector, preview, imageCapture
)
} catch (e: Exception) {
Log.e("CameraX", "바인드 실패", e)
}
}, ContextCompact.getMainExecutor(this))
bindToLifecycle 메서드는 카메라를 Activity의 수명 주기에 바인딩합니다—화면이 회전하거나 애플리케이션이 백그라운드로 전환되면 카메라가 자동으로 해제됩니다. CameraSelector.DEFAULT_BACK_CAMERA는 후면 카메라를 선택하고, 전면 카메라는 DEFAULT_FRONT_CAMERA를 사용합니다. 바인딩 후 Preview는 PreviewView에 카메라 피드를 표시하기 시작하며, 사용자는 화면에서 카메라 이미지를 볼 수 있습니다.
val photoFile = File(
externalMediaDirs.firstOrNull(),
"IMG_${System.currentTimeMillis()}.jpg"
)
val outputOptions = ImageCapture.OutputFileOptions
.Builder(photoFile)
.build()
imageCapture.takePicture(
outputOptions,
ContextCompact.getMainExecutor(this),
object : ImageCapture.OnImageSavedCallback {
override fun onImageSaved(output: ImageCapture.OutputFileResults) {
Log.d("CameraX", "Photo saved: ${photoFile.absolutePath}")
}
override fun onError(exception: ImageCaptureException) {
Log.e("CameraX", "캡처 오류", exception)
}
}
)
takePicture 메서드는 카메라에서 프레임을 캡처하여 파일에 저장합니다. OutputFileOptions는 File, ContentResolver 및 MediaStore에 쓰기를 지원합니다. onImageSaved 콜백에서 애플리케이션은 저장 성공 알림을 받고 UI를 업데이트할 수 있습니다. CAPTURE_MODE_MINIMIZE_LATENCY는 후처리를 줄여 최대 셔터 속도를 보장합니다.
iOS에서 카메라에 대한 액세스는 AVFoundation 프레임워크의 AVCaptureSession 클래스를 통해 제공됩니다. 개발자는 캡처 세션을 생성하고, 필요한 입력(AVCaptureDeviceInput)과 출력(AVCapturePhotoOutput, AVCaptureVideoDataOutput)을 추가한 후 세션을 시작합니다. 미리보기 표시에는 AVCaptureVideoPreviewLayer가 사용됩니다. 아래는 Swift에서 사진 캡처를 위한 세션 설정 예제입니다.
import AVFoundation
let captureSession = AVCaptureSession()
captureSession.sessionPreset = .photo
guard let camera = AVCaptureDevice.default(
for: .video
) else { return }
guard let input = try? AVCaptureDeviceInput(device: camera)
else { return }
let output = AVCapturePhotoOutput()
captureSession.addInput(input)
captureSession.addOutput(output)
DispatchQueue.global(qos: .userInitiated).async {
captureSession.startRunning()
}
AVCaptureSessionPreset.photo는 사진에 최적의 해상도를 설정합니다(최신 기기에서는 일반적으로 12MP). 입력은 기기 카메라용으로 생성된 AVCaptureDeviceInput입니다. 입력과 출력을 추가한 후, 세션은 startRunning을 통해 백그라운드 스레드에서 시작됩니다—오래된 기기에서는 세션 시작에 최대 200ms가 소요될 수 있습니다. 사진을 캡처하려면 capturePhoto(with:delegate:)를 호출하고 결과는 AVCapturePhotoCaptureDelegate를 통해 반환됩니다.
모바일 기기에서 카메라로 작업할 때는 하드웨어 제한을 고려해야 합니다: 장시간 녹화 시 기기 발열, 고해상도 작업 시 배터리 소모, 기기별 카메라 품질 차이. Android에서는 생태계 파편화로 인해 동일한 CameraX 구성이 다른 모델에서 다르게 동작할 수 있습니다. iOS에서는 제한 사항이 주로 라이선스와 관련됩니다: 백그라운드에서 카메라를 사용하려면 Apple의 특별 허가가 필요합니다. 시뮬레이터는 실제 카메라에 액세스할 수 없다는 점도 중요합니다—테스트는 실제 기기에서만 가능합니다.
CameraX는 CameraXConfig 호환성 레이어를 통해 Android 파편화 문제를 해결합니다—라이브러리는 알려진 제조업체 버그에 대한 해결 방법을 자동으로 적용합니다. iOS에서 AVFoundation은 iOS 6 이후 모든 기기에서 일관되게 작동하지만, 일부 기능(인물 모드 또는 LiDAR 등)은 iPhone 12 이상 모델에서만 사용할 수 있습니다. 크로스 플랫폼 애플리케이션을 개발할 때는 카메라 플러그인이 있는 Flutter 또는 React Native를 사용하는 것이 좋습니다—이들은 플랫폼 차이를 추상화하고 두 운영 체제에 통합된 API를 제공합니다.
자주 묻는 질문
대부분의 애플리케이션에서는 사용 편의성, 내장 수명 주기 관리 및 95% 기기와의 호환성 때문에 CameraX를 권장합니다. Camera2는 RAW, 버스트 캡처 또는 수동 센서 제어가 필요한 경우에만 선택해야 합니다.
Android에서는 매니페스트에 CAMERA 권한을 추가하고 런타임에 ActivityCompat.requestPermissions를 통해 요청하세요. iOS에서는 카메라 사용 이유에 대한 명확한 설명과 함께 Info.plist에 NSCameraUsageDescription을 추가하세요.
iOS에서는 백그라운드에서 카메라 사용이 엄격히 제한됩니다—Apple의 특별 허가가 필요합니다. Android에서는 포그라운드 서비스를 통해 카메라를 백그라운드에서 작동시킬 수 있지만, 배터리 수명과 기기 발열에 부정적인 영향을 미칩니다.
iOS 시뮬레이터와 Android 에뮬레이터는 하드웨어 카메라에 액세스할 수 없습니다—물리적 센서를 에뮬레이트하지 않습니다. 카메라 기능을 테스트하려면 항상 실제 기기나 컴퓨터에 연결된 외부 카메라를 사용하세요.
ImageAnalysis는 CameraX의 프레임 스트림 분석기로, 각 프레임을 처리를 위해 ImageAnalysis.Analyzer에 전달합니다. QR 코드 인식, 얼굴 감지, 문서 스캔 및 기타 컴퓨터 비전 작업에 사용됩니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.