본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 05. 27. 17:15

Apple의 LiDAR Room Scanner를 네이티브 Expo 모듈로 래핑하기

요약

Apple의 RoomPlan 프레임워크를 Expo 네이티브 모듈로 구현하여 React Native 앱에서 LiDAR 스캔 기능을 사용하는 방법을 설명합니다. 수동 입력 대신 온디바이스 스캔을 통해 방의 면적과 구조 데이터를 효율적으로 추출하는 가이드를 제공합니다.

핵심 포인트

  • Apple RoomPlan을 Expo 네이티브 모듈 API로 연결하는 방법
  • LiDAR를 활용한 온디바이스 3D 공간 데이터 추출
  • isAvailable 및 scanRoom 함수를 통한 모듈 설계
  • LiDAR 미지원 기기를 위한 Graceful Degradation 전략

대부분의 부동산 및 현장 서비스 앱들은 여전히 사용자에게 방의 치수를 수동으로 입력하도록 요청합니다. 줄자, 펜, 다시 앱으로 돌아오기, 오타 입력, 반복. 이는 지루하고 데이터 손실이 발생합니다.

저는 부동산 점검 앱을 개발해 왔으며, 이번 주에 수동 바닥 면적 입력을 LiDAR 스캔으로 대체하는 기능을 출시했습니다. 방 주변을 30초 동안 걸어 다니며 '완료(Done)'를 누르면 — 앱이 바닥 면적, 벽 개수, 문 개수, 창문 치수, 그리고 각 표면에 대한 신뢰도 점수(confidence score)를 반환합니다. 인터넷 연결이 필요하지 않습니다. 서버 왕복(server round-trips)도 없습니다. 모두 온디바이스(on-device)에서 이루어집니다.

Apple의 RoomPlan 프레임워크를 React Native / Expo 앱에 네이티브 모듈(native module)로 연결하는 방법을 소개합니다.

기본 개념

Apple의 RoomPlan 프레임워크는 iPhone 12 Pro 및 이후 모델의 LiDAR 센서를 사용하여 실시간으로 방의 구조화된 3D 모델을 구축합니다. 이 프레임워크는 바닥, 벽, 문, 창문과 같이 유형화된 객체(typed objects)를 반환하며, 각 객체는 치수와 신뢰도 등급(high, medium, low)을 포함합니다.

과제는 JS/네이티브 경계를 우회하는 편법(hacking) 없이 이를 크로스 플랫폼(cross-platform) Expo 앱에서 구현하는 것입니다.

모듈 구축하기

Expo의 네이티브 모듈(native module) API를 사용하면 기존의 React Native 브릿지(bridge) 방식보다 이를 더 깔끔하게 처리할 수 있습니다. 이 모듈은 두 가지 함수를 노출합니다:

  • isAvailable() — 동기식(synchronous) 체크, LiDAR 및 iOS 17 이상인 경우 true 반환
  • scanRoom() — 비동기식(async), 전체 화면 캡처 UI를 표시하고 구조화된 결과로 해결(resolve)
AsyncFunction("scanRoom") { (promise: Promise) in
  guard RoomCaptureSession.isSupported else {
    promise.reject("UNSUPPORTED", "Requires a LiDAR-equipped device")
...

뷰 컨트롤러(view controller)는 captureSession.run(configuration:)을 실행하고, RoomCaptureSessionDelegate를 통해 다시 위임하며, 사용자가 '완료(Done)'를 누르면 가공되지 않은 CapturedRoomDataRoomBuilder에 전달합니다. 빌더는 정리 작업(.beautifyObjects 사용)을 수행한 후 CapturedRoom을 반환합니다.

반환되는 데이터

let floorArea = room.floors
  .map { Double($0.dimensions.x) * Double($0.dimensions.y) }
  .reduce(0, +)

저는 결과를 일반 딕셔너리(plain dictionary) — m² 단위의 면적, 표면별 치수, 신뢰도 문자열 — 로 매핑하고 Expo Promise를 해결(resolve)합니다. JS 측에서는 타입이 지정된 객체(typed object)를 받게 됩니다:

const result = await RoomPlan.scanRoom();
console.log(result.floorAreaM2); // 예: 18.34
console.log(result.floors[0].confidence); // "high"

Graceful Degradation (우아한 성능 저하)

LiDAR가 없는 기기는 isAvailable()false를 반환하며 수동 입력 양식으로 넘어갑니다. 앱 충돌이나 혼란스러운 에러는 발생하지 않습니다. LiDAR 경로는 기능 향상을 위한 것이지, 필수적인 의존성(hard dependency)이 아닙니다.

여기서 온디바이스(On-Device)가 중요한 이유

부동산 데이터의 경우, 평면도를 클라우드 서비스로 전송하는 것은 지연 시간(latency), 비용, 그리고 개인정보 보호 문제를 야기합니다. 모든 스캔이 완전히 온디바이스(on-device)에서 이루어진다는 것은 스캔당 API 비용이 발생하지 않고, 왕복 시간(round-trip)을 기다릴 필요가 없으며, 사용자가 명시적으로 보고서를 제출하기 전까지는 평면도가 휴대폰을 떠나지 않음을 의미합니다.

실질적인 결과: 바닥 면적 측정 시간이 수동 입력 시 약 3분에서 60초 미만으로 단축되었으며, 줄자로 입력하는 것보다 정확도가 높았습니다. iPhone Pro 하드웨어에서 LiDAR 측정값은 일반적인 직사각형 방 기준으로 몇 센티미터 이내의 정확도를 보여줍니다.

알아두어야 할 한계점

RoomPlan은 LiDAR 센서를 필요로 합니다 — iPhone 12 Pro 이후 모델 또는 iPad Pro가 필요합니다. 대부분의 현장 작업은 휴대폰에서 이루어집니다. 모든 사용자를 대상으로 하는 소비자용 앱이라면 폴백(fallback) 기능이 필요합니다. 하드웨어를 제어(또는 지정)할 수 있는 전문가용 도구라면, 아예 LiDAR를 필수 요구 사항으로 지정하는 것도 가치가 있습니다.

iOS에서 물리적 공간 측정과 관련된 무언가를 구축하고 있다면, RoomPlan은 극도로 저평가되어 있습니다. Apple은 완전한 구조적 캡처 파이프라인(structured-capture pipeline)을 제공하고 있음에도 불구하고, 대부분의 앱은 여전히 사용자에게 양식에 숫자를 직접 입력하도록 요청하고 있습니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0