
AI에게 '지시'만으로 앱을 출시하다: 맡길 수 있는 영역과, 놓칠 수 없는 선을 만들다
요약
코드를 한 줄도 작성하지 않고 오직 AI에 대한 '지시'만으로 macOS 앱을 개발하고 출시한 사례를 다룹니다. 막연한 요구사항을 구체적인 지시로 유형화하고, 결과물을 다른 AI로 검증하는 시스템적 접근법을 소개합니다.
핵심 포인트
- 사용자의 언어를 AI가 이해할 수 있는 구체적인 지시로 번역하는 과정이 핵심임
- 결과물의 오류를 방지하기 위해 여러 관점의 AI를 활용한 검증 시스템 구축 필요
- 단순 지시를 넘어 지시를 내리는 방식과 결과물을 수용하는 프로세스의 시스템화가 중요
레이스 영상에 심박수나 페이스를 겹쳐 보고 싶다는 생각에서 시작해 macOS 앱 하나를 개발했고, Mac App Store까지 출시했습니다. 구현은 전적으로 AI에게 맡겼고, 제가 넘겨준 것은 사용해보면서 느낀 '지시'뿐이었습니다. 소스 코드는 한 줄도 작성하지 않았고, 읽어본 적도 없습니다.
'AI가 똑똑해져서 누구나 만들 수 있다'는 말은 절반은 맞습니다. 하지만 '지시만으로 혼자 출시까지 해낼 수 있는 것'은, 지시만으로 충분하도록 보이지 않는 하부 구조를 설계했기 때문이기도 합니다. 그리고 마지막에는 AI가 건드릴 수 없는 선이 남아있습니다. 이 글은 그 표면과 이면의 이야기입니다.
ActivityVideoStudio라는 macOS 앱입니다. Garmin 기록과 GoPro 영상을 시간 동기화하여, 달리는 영상에 심박수, 페이스, 지도, 고도 정보를 겹쳐서 출력합니다. 레이스를 되돌아보는 것이 훨씬 즐거워집니다. 현재 Mac App Store에서 판매 중입니다.
그렇다면 제가 AI에게 무엇을 넘겨주었을까요? AI(codex와 Claude Code)에게는 사용해보면서 느낀 지시들뿐이었습니다. 실제로 작성했던 요청들을 그대로 나열합니다.
- '트림 입력란에 숫자를 넣어도 반응하지 않습니다. 슬라이더와도 연동되지 않습니다.'
- '영상을 드롭해도, 로딩이 끝났는지 알 수 없습니다.'
- '마우스 휠로 영상 시간을 되감기/빨리 감기가 가능하도록 하고 싶습니다.'
- '출력 진행 상황에 '완료 후 종료', '절전 모드 방지', '남은 시간'을 표시해 주세요.'
- '텍스트가 화면 너비를 초과합니다.'
- '다크 모드의 배경이 부자연스럽습니다. VoiceOver에도 대응해 주세요.'
함수 이름도, 파일 이름도 한 번도 언급되지 않았습니다. 사용하는 사람의 불만과 요구사항의 언어일 뿐입니다.
그냥 던져두고 방치한 것은 아닙니다. '출력하면 내용이 비어있고 오류 메시지도 나오지 않는다'는 증상을 상세하게 전달하자, AI가 원인(중간 파일 저장 위치)을 찾아내 수정했습니다. 구현 과정에서 막히는 부분들은 대부분 이런 식으로 해결할 수 있었습니다.
실제로 손을 움직인 것은 git 기록으로 약 25시간 정도입니다. 자투리 시간에 23번 정도 접속한 수준이었고, 그 사이에는 긴 공백도 있었습니다. 무언가를 작성하거나 읽기보다는, 나온 결과물을 확인하고 다음 지시를 내리는 과정이 반복되었습니다. 이 반복의 시간이 25시간이었습니다. AI와 주고받은 양은 총합으로 약 10억 토큰입니다. 만약 종량제(pay-as-you-go)로 계산한다면 대략 40만 원 정도가 되지만, 실제로는 월별 구독료 안에서 추가 청구는 발생하지 않았습니다.
여기까지는 누구나 똑같아 보일 수 있습니다. 외부에 드러나는 조작은 '불만을 말하는 것'에 불과하기 때문입니다.
그럼에도 불구하고 혼자 힘으로, 무너지지 않고 출시까지 진행할 수 있는 것은, 지시를 내리는 방식과 결과물을 받아들이는 방식을 사전에 시스템화했기 때문입니다.
크게 세 가지로 구성되어 있습니다.
1. 전달하는 방식을 유형화(型)한다. '뭔가 이상하다'라는 막연한 상태로는 AI가 움직일 수 없습니다. 그래서 전달하기 전에, 머릿속의 '트림이 잘 안 된다'는 것을, '트림 입력란에 숫자를 넣어도 반응하지 않습니다. 슬라이더와도 연동되지 않습니다.'처럼 —어떤 조작으로・무엇이 발생하고・어떻게 되어야 하는지—까지 스스로 분해합니다. 막연한 불만을 AI가 한 번의 작업으로 고칠 수 있는 지시로 만든 후 넘깁니다. 이 번역은 AI가 아니라 제 자신의 작업입니다. 위에 나열된 6가지 항목은 그 유형을 거친 언어들입니다.
2. 나온 결과물을 다른 AI에게 검증하게 한다. 여기가 가장 효과적이었습니다. 변경 사항이 생길 때마다, 제가 만든 하네스(harness)가 뒤에서 여러 명의 리뷰 역할을 수행합니다. 관점들을 의도적으로 분산시켰습니다 — '전에 작동하던 부분이 고장 나지 않았는지', '수정 방법이 정말 올바른지', '불필요한 부작용은 없는지', '위험한 부분은 없는지'. 각 역할이 실제 코드에 적용하여 확인하고, 중요한 것들만 '이것을 봐달라'며 제게 올라옵니다.
예를 들어, 글자가 화면 밖으로 나가는 버그를 고쳤을 때. 리뷰 역할을 맡은 AI 중 하나가 이렇게 작성했습니다 — '글자 수로 가장 긴 줄을 측정하는 오래된 방식은 틀렸다. WWWW와 iiiiii처럼, 글자 수가 같아도 렌더링 폭은 다르다. 모든 줄의 실제 렌더링 폭을 측정하여 최댓값을 취하는 것이 옳다'. 이것을 작성한 것은 AI 리뷰 역할이었고, 저는 코드를 열어보지 않았습니다. 제가 가진 것은 코드를 읽는 능력이 아니라, 코드를 읽게 하고 검증하게 하는 시스템입니다.
3. 멈출 지점을 미리 정해둔다. 모든 것을 맡기지는 않습니다. 맡겨도 되는 부분과, 스스로 판단해야 하는 선을 사전에 그어둡니다. 손으로 움직이는 시간이 줄어든 만큼, 가치는 이 '선 긋기' 쪽으로 이동합니다.
25시간 만에 끝난 것도, 구독료 내에서 해결된 것도 이 하부 구조가 있기 때문입니다. 미리 받침대가 마련되어 있으니, 한 번의 입력은 작고 충분할 수 있습니다. AI가 빨라질수록, 차이가 벌어지는 곳이 바로 그 지점입니다.
AI에게 어디까지 위임하고, 어디서 내가 멈출지. 그 '내가 멈추는' 쪽에 모든 것이 걸려왔는데, 그것이 공개 직전이었습니다.
Mac App Store 심사에서 두 번 거절당했다. 첫 번째는 심사위원이 구동해 볼 수 있는 샘플이 없다는 지적이었다. 검증용 .FIT 파일과 짧은 클립을 준비하고, 절차를 첨부하여 재제출했다.
문제는 두 번째였다. Guideline 5.2.1 — 앱 이름이나 설명에서 「Garmin」, 「GoPro」를 전면에 내세우고 있다는 내용이었다. 타사의 이름을 자신의 앱 간판으로 빌려 써서는 안 된다.
해결 방법은 간판의 단어를 총칭(Generic term)으로 교체하는 것이었다. 실제로 다음과 같이 고쳐 썼다.
- 「카메라: GoPro」 → 「카메라: 액션 카메라」
- 「GPS: Garmin Fenix 8」 → 「GPS: GPS 워치」
- 「Garmin .FIT 파일(Fenix, Forerunner 등)」 → 「.FIT 액티비티 파일(GPS 스마트워치로 기록)」
총칭으로 바꾸는 표현 자체는 AI에게 부탁하면 얼마든지 나온다. 문제가 된 것은 그 다음이었다. 어떤 사실은 남기고, 어떤 것을 제외할 것인가. 「지원 포맷은 .FIT」는 사실이기에 간판에 남겨도 된다. 「Garmin 지원」은 타인의 이름을 빌려 신뢰를 얻으려는 것이기에 제외한다.
이 선은 앱이 무엇을 위해, 누구를 향해 있는지를 알고 있는 본인만이 그을 수 있었다. AI는 무한한 표현을 제시하지만, 「어느 것이 여전히 정직한가」는 알려주지 않는다. 미리 정해두었던 '인간이 멈추는 지점'이 여기서 빛을 발했다. 두 번째 재제출에서 통과했다.
AI가 구현을 통째로 맡아주었다. 남은 것은 코드가 아니라, 맡길 수 있는 상태를 만드는 것과 마지막에 어디서 멈추고 무엇이라 자처할지를 결정하는 것이었다. 내가 만들고 있었던 것은 앱이라기보다, 그 만드는 방식이었을지도 모른다.
- ActivityVideoStudio (Mac App Store): https://apps.apple.com/app/activityvideostudio/id6764239734
- 출력 샘플 (YouTube): https://youtu.be/UtKdCmAf-xk
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기