Anthropic의 명령줄 AI 코딩 도구 Claude Code로 만든 iPhone 텔레프롬프터 앱이 Apple의 심사를 통과해 App Store에 출시됐습니다. 화면 설계, 빌드, 테스트, 필요한 이미지 자료 제작, 심사 제출까지 Claude Code가 맡았지만 한 번의 prompt(AI에 작업을 지시하는 글)로 끝난 일은 아닙니다. prompt 215번, 커밋 120개가 쌓이는 동안 기능을 하나씩 만들고 곧바로 시험하는 과정을 되풀이했습니다. 결과를 가른 것은 코드를 생성하는 속도보다 실제 기기로 확인하는 반복 구조, 그리고 추측 대신 데이터로 버그를 잡는 습관이었던 것으로 보입니다.

렌즈 바로 옆에서 대본을 읽는 앱

이 앱은 카메라 앞에서 말하는 사람이 렌즈를 보며 대본을 읽도록 돕는 텔레프롬프터입니다. 출발점은 기존 텔레프롬프터 앱에 대한 불만이었습니다. 화면이 어수선하거나 조작 버튼이 작고, 글자가 카메라 렌즈에서 너무 멀리 떨어져 있어 자연스럽게 눈을 맞추기 어려웠습니다. 그래서 대본이 지나가는 읽기 선을 전면 카메라 구멍 바로 옆에 두었습니다. 이렇게 하면 녹화된 결과물을 보는 사람은 말하는 사람이 계속 눈을 맞추고 있다고 느낍니다.

주요 기능은 다음과 같습니다.

  • 대본을 쓰거나 불러와 고정된 읽기 선 아래로 흘려 보내기
  • 글꼴, 줄 간격, 여백, 스크롤 속도 조절과 글자 테마 설정
  • 유리판을 쓰는 촬영 장비에 맞춘 화면 반전
  • 전면·후면 카메라 녹화와 리모컨 조작
  • Apple Watch에서 재생과 속도를 조절하는 보조 앱
  • 계정, 클라우드 저장, 사용 분석 기능이 없는 오프라인 로컬 저장

prompt 한 번이 아니라 215번의 협업

항목 수치
Claude Code에 보낸 prompt 215번
쌓인 커밋 120개
자동 UI 테스트 25개
Apple Developer Program 연회비 $99

완성도 있는 앱이 prompt 한 번으로 나오기는 어렵습니다. 이 프로젝트는 Claude Code를 대화하며 함께 일하는 엔지니어처럼 대했습니다. 구성 요소를 하나씩 만들고, 바꿀 때마다 바로 시험했습니다. App Store 심사를 통과해야 하는 실제 소비자용 앱을 한 번에 생성한다는 기대는 현실과 거리가 멀다는 것이 이 사례에서 얻은 판단입니다.

시뮬레이터 대신 실제 iPhone에서 바로 시험

작업 흐름의 중심은 터미널에서 돌아가는 자동 확인 루프였습니다. Claude Code가 코드를 고치면 다음 과정이 이어집니다.

  1. Claude Code가 코드를 수정합니다.
  2. xcodebuild 명령으로 앱을 빌드합니다.
  3. xcrun devicectl 명령으로 연결된 iPhone에 앱을 설치합니다.
  4. 설치한 앱을 곧바로 실행해 손으로 확인합니다.

실기기 시험이 중요한 까닭은 Mac의 iOS 시뮬레이터로는 판단할 수 없는 것이 많기 때문입니다. 버튼이 누르기 쉬운 크기인지, 햅틱 반응이 적절한지, 대본이 편하게 읽히는지, 렌즈와 눈 맞춤 각도가 맞는지는 손에 쥔 기기에서만 알 수 있습니다. 뒤에서 다룰 심각한 멈춤 버그도 시뮬레이터에서는 드러나지 않았습니다. AI coding agent(코드를 직접 고치고 명령을 실행하며 개발 작업을 이어 가는 AI)는 단순히 코드를 생성하는 도구로 쓸 때보다 이렇게 빌드와 설치가 끊임없이 도는 흐름에 연결할 때 훨씬 효과적이라는 것이 이 사례의 결론입니다.

노트북에서 고친 앱이 케이블로 스마트폰에 설치되고 손으로 시험하는 순환

▲ 실기기 확인 루프

Figma를 건너뛰고 코드에서 바로 디자인

흔히는 Figma로 화면을 먼저 그린 뒤 Swift 코드로 옮기지만, 이 프로젝트는 그 단계를 건너뛰었습니다. Apple 디자인 키트의 표준 컴포넌트를 써서 Claude Code 안에서 바로 화면을 만들었습니다. 표준 iOS 컴포넌트만 쓰기로 한 제약이 오히려 도움이 됐습니다. 디자인 시스템을 처음부터 만들지 않고도 iOS 앱다운 일관된 사용감을 얻을 수 있었기 때문입니다.

그렇다고 한 번에 끝나지는 않았습니다. 조작 버튼이 여러 카메라 배경 위에서도 잘 보이고 잘 눌리게 하는 일, 세로와 가로 화면, Dynamic Island 주변에서도 제대로 동작하게 하는 일에 여러 번의 수정이 필요했습니다.

여기서 사람의 몫이 분명해집니다. Claude Code는 요청받은 코드는 무엇이든 만들어 내지만, 디자인 감각이나 판단까지 스스로 갖췄다고 보기는 어렵습니다. 어떤 화면이 좋은지 가리는 안목과 비판적인 판단, 앱 구조에 대한 분명한 제약 조건은 사람이 줘야 합니다. 온보딩, 설정 메뉴, 화면 이동처럼 흔하지만 까다로운 화면은 실제 앱의 화면과 사용 흐름을 모아 둔 디자인 참고 서비스에서 검증된 패턴을 먼저 살펴본 뒤 prompt를 쓰는 방식으로 다뤘습니다.

실기기에서만 멈춘 앱, 추측 대신 로그로 찾은 원인

개발 도중 대본을 열려고 누르면 실제 iPhone에서 앱이 완전히 멈추는 문제가 생겼습니다. 시뮬레이터에서는 지연 없이 매끄럽게 돌아가서 더 까다로운 버그였습니다.

Claude Code의 첫 대응은 추측이었습니다. TextKit의 동기식 레이아웃 처리를 원인으로 지목하는 등 몇 가지 가설을 내놓았지만 문제를 고치지 못했습니다. 방향을 바꾼 것은 진단 데이터였습니다. Claude Code가 성능 기록용 코드를 직접 작성해 넣고, devicectl로 연결된 iPhone에서 실행 로그를 꺼내 왔습니다.

로그를 분석하자 원인이 드러났습니다. 대본을 띄우는 화면이 51.1초 동안 11,645번이나 다시 초기화되고 있었습니다. 화면이 만들어질 때 기본 표시 설정을 저장하는데, 이 저장이 SwiftUI의 데이터 조회(query)를 무효화해 화면을 다시 만들게 하고, 다시 만들어진 화면이 또 설정을 저장하는 순환이었습니다. 이 순환을 끊자 멈춤 현상이 사라졌습니다.

같은 버그에 AI가 틀린 추측을 되풀이한다면 추측을 더 요청하기보다 진단용 로그를 넣게 하는 편이 가장 확실한 해결 경로로 보입니다. 막연한 prompt를 거듭하기보다 기기에서 직접 진단 데이터를 모으는 편이 훨씬 낫다는 것이 이 버그가 남긴 교훈입니다.

돋보기로 실행 로그를 살펴 끝없이 반복되는 순환을 찾는 장면과 멈춘 스마트폰

▲ 진단 로그로 찾은 무한 반복

자동 UI 테스트 25개로 회귀 막기

기능이 늘수록 한 곳을 고쳤는데 다른 곳이 깨지는 회귀가 생기기 쉽습니다. 이를 막기 위해 Claude Code에 자동 UI 테스트 25개를 만들게 했습니다. 대본 만들기, 이름 바꾸기, 정렬, 표시 설정 조절처럼 여러 상태가 얽히는 동작을 확인하는 테스트입니다.

이 테스트는 곧 제 역할을 했습니다. 대본 저장 방식을 바꾸는 수정 뒤에 삭제와 이름 바꾸기 흐름에 걸친 테스트 13개가 한꺼번에 실패했고, 덕분에 근본 원인을 빠르게 찾아 고쳐 25개 모두 통과하는 상태로 되돌렸습니다. 다만 테스트를 모두 통과했다고 버그가 없다고 단정할 수는 없습니다. 카메라 하드웨어, 센서, 기기 회전처럼 실제 기기에 얽힌 부분은 특히 그렇습니다.

한 번 반려된 App Store 심사를 넘기까지

App Store에 배포할 수 있도록 연회비 $99의 Apple Developer Program에 가입했습니다. 출시 준비도 상당 부분 Claude Code가 맡았습니다. 배포용 빌드를 자동으로 만들고, 여러 화면 크기의 시뮬레이터로 홍보용 스크린숏을 만들고, 앱 소개 문구 초안을 썼습니다.

첫 심사 결과는 반려였습니다. Apple은 심사 지침 Guideline 2.1(Information Needed, 정보 필요)을 들어 앱이 실제로 동작하는 모습을 담은 데모 영상과, 앱 사용 방식과 외부 의존 요소에 대한 자세한 답변을 요구했습니다. 하드웨어 권한과 리모컨 조작 기능을 확인하려는 요구였습니다.

데모 영상을 올리는 단계에서도 한 번 막혔습니다. 화면을 녹화한 HEVC 형식의 399MB 파일은 App Store Connect의 업로드 한도를 넘었고, 압축 방식(코덱)도 지원 대상이 아니었습니다. Claude Code가 ffmpeg 명령을 만들어 실행해 해상도를 조정하고 H.264 형식으로 변환하자 파일은 7.4MB가 됐고, Apple은 이 파일을 받아들였습니다. 이어 1.0 버전이 승인되어 앱이 App Store에 올라갔습니다.

단계 결과
첫 제출 Guideline 2.1로 반려, 데모 영상과 답변 요구
데모 영상 업로드 399MB HEVC 파일 거부
ffmpeg 변환 7.4MB H.264 파일 업로드 성공
재심사 1.0 버전 승인, App Store 출시

따라 하려면 다섯 가지부터

이 사례를 보면 Claude Code는 디자인 구상과 실제 제품 개발 사이의 거리를 크게 줄여 줄 수 있습니다. 다만 요구 사항을 구체적으로 정하고 실제 기기에서 꼼꼼히 시험한다는 조건이 붙습니다. AI로 iPhone 앱을 만들어 보려는 사람이라면 다음 순서로 준비하면 됩니다.

  1. 실기기 확인 루프부터 만듭니다. xcodebuild와 xcrun devicectl로 고친 앱을 연결된 iPhone에 바로 설치하고 실행하게 합니다.
  2. 화면은 Apple 표준 컴포넌트로 코드에서 바로 만들고, 설정이나 온보딩처럼 복잡한 흐름은 실제 앱 사례를 먼저 살펴본 뒤 prompt를 씁니다.
  3. AI가 같은 버그에 틀린 추측을 되풀이하면 진단 로그를 넣게 하고, 기기에서 로그를 꺼내 원인을 확인합니다.
  4. 자동 UI 테스트를 일찍 만들어, 데이터 저장처럼 여러 기능에 걸친 부분을 고칠 때 생기는 회귀를 잡습니다.
  5. 심사용 데모 영상은 H.264 형식으로 변환하고 업로드 한도 아래로 압축해 둡니다.

디자인 감각과 최종 판단은 여전히 사람의 몫입니다. AI를 한 번에 앱을 뽑아 주는 도구가 아니라 빌드와 시험을 함께 되풀이하는 동료로 쓸 때, 혼자서도 완성된 iPhone 앱을 출시할 수 있다는 것이 이 사례가 주는 메시지로 보입니다.