Skip to content

Conversation

@easyhooon
Copy link
Contributor

@easyhooon easyhooon commented Feb 3, 2026

🔗 관련 이슈

📙 작업 설명

  • CameraX PreviewView(AndroidView) → CameraXViewfinder(Compose) 마이그레이션
  • LifecycleCameraController → ProcessCameraProvider + Preview + ImageCapture로 전환
  • androidx-camera-view 의존성 제거, androidx-camera-compose 의존성 추가

🧪 테스트 내역 (선택)

  • 주요 기능 정상 동작 확인
  • 브라우저/기기에서 동작 확인
  • 엣지 케이스 테스트 완료
  • 기존 기능 영향 없음

💬 추가 설명 or 리뷰 포인트 (선택)

  • ProcessCameraProvider → 카메라 use case(Preview, ImageCapture)를
    lifecycle에 바인딩하는 역할
  • SurfaceRequest → Preview가 만들어낸 카메라 프레임을 CameraXViewfinder
    Composable에 전달하는 역할
  • CameraXViewfinder는 SurfaceRequest를 통해 카메라 프레임을 전달받는데, 기존 LifecycleCameraController는 SurfaceRequest를 외부로 제공하지 않으므로 ProcessCameraProvider로 전환했습니다.

reference)
Compose-Native CameraX Is Now Stable: End-to-End Guide for Jetpack Compose
[Android/Compose] CameraX 사용해서 QR 코드 스캔하기

Summary by CodeRabbit

  • 리팩토링
    • 카메라 녹화 기능의 기술 기반을 최신 라이브러리로 업데이트했습니다. 내부 구현 방식을 개선하여 장기적인 유지보수성과 안정성을 높였습니다.

@coderabbitai
Copy link

coderabbitai bot commented Feb 3, 2026

Walkthrough

CameraX 통합 방식을 AndroidView 기반 CameraController에서 Compose 기반 ProcessCameraProvider로 마이그레이션했습니다. 의존성 선언을 업데이트하고 카메라 프리뷰 구현을 CameraXViewfinder로 변경했으며, 이미지 캡처 로직을 조정했습니다.

Changes

Cohort / File(s) Summary
CameraX Compose 마이그레이션
feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/ocr/content/OcrCameraContent.kt
CameraController 기반 설정을 ProcessCameraProvider, Preview, ImageCapture를 사용하는 CameraX 파이프라인으로 교체했습니다. LifecycleCameraController와 PreviewView 제거, AndroidView 통합 제거, surfaceRequest 상태 기반 CameraXViewfinder로 변경했습니다.
의존성 및 라이브러리 선언 업데이트
feature/record/build.gradle.kts, gradle/libs.versions.toml
CameraX 라이브러리 의존성을 androidx.camera.view에서 androidx.camera.compose로 변경했습니다. 두 파일 모두 Compose 기반 카메라 UI 통합으로 일관되게 업데이트되었습니다.

Sequence Diagram(s)

sequenceDiagram
    participant App as 앱
    participant Provider as ProcessCameraProvider
    participant Preview as Preview
    participant Capture as ImageCapture
    participant Viewfinder as CameraXViewfinder

    App->>Provider: awaitInstance() 요청
    Provider-->>App: Provider 반환
    App->>Preview: Preview 생성
    App->>Capture: ImageCapture 생성
    App->>App: surfaceRequest 상태 업데이트
    Viewfinder->>App: surfaceRequest 구독
    App->>Provider: Preview + ImageCapture 바인딩
    Provider-->>Preview: 카메라 프레임 제공
    Preview-->>Viewfinder: 프레임 렌더링
    App->>Capture: takePicture() 호출
    Capture-->>App: 캡처 완료 콜백
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 AndroidView는 안녕, Compose가 안녕!
카메라 미리보기, 새롭게 흐르네,
ProcessCameraProvider와 손을 잡고,
CameraXViewfinder 춤을 춘다네!
순수한 Composable의 시대,
더 밝고 깨끗하게 ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목은 AndroidView와 PreviewView에서 Composable CameraXViewfinder로의 마이그레이션이라는 주요 변경사항을 명확하게 요약합니다.
Linked Issues check ✅ Passed PR의 코드 변경사항이 링크된 이슈 #256의 모든 주요 목표를 충족합니다. AndroidView 제거 및 Composable 카메라 프리뷰 구현이 완료되었습니다.
Out of Scope Changes check ✅ Passed 모든 변경사항이 CameraX AndroidView에서 Compose 기반 CameraXViewfinder로의 마이그레이션 범위 내에 있습니다.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch BOOK-493-refactor/#256

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
feature/record/build.gradle.kts (1)

13-23: ⚠️ Potential issue | 🟡 Minor

feature 모듈에 camera-compose 직접 선언은 타당합니다.
카메라 Compose 전환에 맞춘 적절한 의존성 추가이며, camera-compose는 1.5.1부터 안정화되었습니다. 다만 버전을 현재 최신 안정화 버전인 1.5.3(2026년 1월 28일 릴리스)으로 업데이트하는 것을 권장합니다. 1.5.3에는 ExifInterface 관련 JPEG 파싱 문제 수정이 포함되어 있습니다.

🧹 Nitpick comments (1)
feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/ocr/content/OcrCameraContent.kt (1)

133-144: 카메라 바인딩 실패 시 에러 처리가 누락되었습니다.

bindToLifecycle이 실패할 경우(예: 카메라가 다른 앱에서 사용 중이거나 하드웨어 오류) 예외가 발생할 수 있습니다. try-catch로 감싸서 사용자에게 적절한 피드백을 제공하는 것을 권장합니다.

♻️ 에러 처리 추가 제안
 LaunchedEffect(isGranted) {
     if (!isGranted) return@LaunchedEffect
-    ProcessCameraProvider.awaitInstance(context).apply {
-        unbindAll()
-        bindToLifecycle(
-            lifecycleOwner,
-            CameraSelector.DEFAULT_BACK_CAMERA,
-            preview,
-            imageCapture,
-        )
+    try {
+        ProcessCameraProvider.awaitInstance(context).apply {
+            unbindAll()
+            bindToLifecycle(
+                lifecycleOwner,
+                CameraSelector.DEFAULT_BACK_CAMERA,
+                preview,
+                imageCapture,
+            )
+        }
+    } catch (e: Exception) {
+        // 카메라 바인딩 실패 처리 (예: 에러 이벤트 전송)
+        // state.eventSink(OcrUiEvent.OnCameraBindingFailed(e))
     }
 }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BOOK-493/refactor] CameraX AndroidView -> Compose 마이그레이션

2 participants