[스스챌 도전기] 07. 앱 프로토타입 만들기

디자인 컨셉과 레이아웃이 나왔으므로 앱 프로토타입을 만들어야 한다.

왜 실제 앱을 바로 만들지 않고 프로토타입부터 만드느냐? 이것은 사람마다 방식이 갈릴 수도 있겠지만, 나의 경우는 테스트 이미지와 테스트 시안으로 프로토타입을 만들고 그 이후에 디테일한 맵 설정과 디자인, 이미지 교체 등을 진행하고자 한다.

즉 실제 앱이 원하는 프로세스에 맞춰서 진행되는지, 원하는 기능을 구현할 수 있는지, 그리고 궁극적으로 재미있는지를 먼저 점검하고 그 이후에 개선해나가는 방식을 택한 것이다.

개발 환경

나는 우선 Antigravity1라는 VSC 기반의 AI 코딩 툴을 활용해 개발을 진행했다. Claude Code와 같이 성능이 조금 더 좋은 툴을 쓸 수도 있겠지만 내가 만드는 게임 정도는 코딩 실력이 엄청날 필요는 없다고 느꼈다. 특히, 나는 이미 Google One 계정이 있기 때문에 Antigravity를 통해 개발을 진행하는게 더 이득이었다.

AI와 함께 코딩을 진행하며 제일 중요하게 생각한 것은 규칙이었다. AI가 하고 있는 것을 트래킹하고, 내가 개입한 경우 어떻게 개입했는지 상호 트래킹이 가능해야했다. 또한 코딩 규칙이나 변수명, 기능들을 서로 공유해야했다. 따라서 나는 한개의 공동 마크다운 텍스트 파일을 만들어 이곳에서 모든 규칙을 공유했다.

이 앱은 무엇에 관한 것이고, 어떠한 어떠한 프레임워크와 기반이 들어가야 하며, 제약사항과 꼭 지켜야 하는 사항은 무엇인지. 개발 규칙과 변수명 설정 방법 등은 무엇인지, 그리고 가장 중요한 것은 하단에 개발로그를 무조건 남기도록 해 서로 진행상황과 로그 확인을 가능하도록 했다.

Antigravity를 활용하여 AI와 협업하며 앱을 개발 중인 화면 스크린샷. 전체적으로 어두운 다크 모드 테마의 인터페이스를 가지고 있으며, 중앙 편집기 영역에는 개발 규칙과 작업 로그가 기록된 마크다운(.md) 파일이 열려 있다. 우측 사이드바에는 AI 챗봇 인터페이스가 배치되어 개발자와 실시간으로 소통하며 코드를 개선하거나 문제를 해결하는 워크플로우를 보여준다. 중앙의 마크다운 문서에는 날짜별 수정 목적, 수정 내용, 예상 결과가 상세하게 한글로 기록되어 있어, AI와 인간 개발자 간의 작업 충돌을 방지하기 위한 체계적인 가이드라인을 유지하고 있다. ## 2026-02-24 09:03 수정 목적: 사용자가 손바닥으로 귀를 완벽하게 밀착시켰을 때 카메라가 손가락/손등 랜드마크를 보지 못해 손 인식이 순간적으로 소실('nil')되면, 귀 막음('covering ears') 모드가 바로 'NO'로 풀려버리는 불상사 발생. 한 번 귀를 막은 이후로는 화면에 양손이 확실하게 다시 등장해 물리적으로 멀리 있는 게 확인되었을 때만 해제되도록 방어 로직 설계. 수정 내용: ActionDetector.swift의 checkEarCover 함수 내에서 leftHandCenter나 rightHandCenter가 소실되었을 때 무조건 isCoveringEars = false로 초기화하던 예외 처리 구문을 제거하고 return만 수행하도록 변경. 손이 모두 확실히 관측되었고 임계값 위('false' 판정)일 때만 귀막음을 해제함. 예상 결과: 귀에 손을 아주 바짝 밀착시켜서 Vision 센서가 일시적으로 손가락들을 잃어버리더라도, "가장 마지막으로 확인했을 때 귀 근처에 손이 있었고, 아직 그 손이 화면 다른 곳으로 벗어난 모습이 찍히지 않았으므로 손은 계속 귀에 있을 것이다"라고 스마트하게 유추하여 'YES' 상태를 굳건히 유지하게 됨. 손을 명확히 내려 카메라가 손의 위치를 다시 찾아내고 거리를 계산해 멀어졌음을 확신지어야 'NO'로 변경됨.
Antigravity에서 앱을 개발하는 화면 – AI와 공동 규칙 및 로그를 설정함

Swift Student Challenge에 출품하는 작품은 앱 플레이그라운드(.swiftpm) 파일이어야 하며 아이패드 혹은 맥에서 구동이 되어야 한다. 따라서 실제 앱의 패키지 파일을 관리하고, 테스트 시뮬레이션을 돌리면서 개발하기 위해서는 Xcode가 거의 반 필수이다. 따라서 나는 Xcode와 Antigravity를 동시에 켜놓고, 두 IDE를 보며 수정을 진행하였다.

Swift Student Challenge 출품용 게임을 개발 중인 맥북(macOS) 작업 화면 스크린샷. 다크 모드 테마가 적용된 개발 환경으로, 화면 좌측에는 Xcode가 실행되어 있으며 'AboutView.swift' 파일의 SwiftUI 코드가 열려 있다. 중앙 하단에는 인스펙터 창이 떠 있고, 화면 우측에는 Visual Studio Code(Antigravity)가 배치되어 'DesignSystem.swift' 파일의 복잡한 로직과 수학적 함수 코드를 편집하고 있다. 하단에는 개발용 터미널 창이 활성화되어 있으며, 전체적으로 정돈된 멀티태스킹 개발 환경을 보여준다. 주요 텍스트 설명: Xcode (좌측 상단 및 중앙) Project Name: Unfiltered world File: AboutView.swift Code Snippet: * import SwiftUI struct AboutView: View { ... } ZStack { DesignSystem.Colors.background... } VStack(spacing: DesignSystem.Spacing.large) { Text("about_title")... } Link: 세종글꽃체 (Sejong Geulggot) 다운로드 URL 포함 Visual Studio Code / Antigravity (우측) File: DesignSystem.swift Code Snippet: * func noise(_ x: CGFloat, _ y: CGFloat) -> CGFloat { ... } let wave1 = sin((x + y) * 0.038 + seed * 2.0) path.addQuadCurve(to: CGPoint(x: w - cr, y: h + noise...)) Status Bar: Screen Reader Optimized, Ln 76, Col 12, Spaces: 4, UTF-8, Swift
게임을 개발중인 화면

앱을 개발하는 단계에서 나는 아카이빙과 개발 로그 기록을 위해 별도의 github 페이지를 만들어 관리했다. Github을 사용할 때의 장점은 이미 개발자분들이라면 모두 아실거라 생각한다. 실시간으로 수정된 코드를 확인하고 변경사항을 기록할 수 있다. 그리고 개발 중 잘못될 경우 이전 버전을 다시 복원시킬 수 있다.

GitHub의 'Unfiltered' 프라이빗 저장소(Private Repository) 메인 화면 캡처. macOS 다크 모드 환경에서 브라우저를 통해 접속한 화면으로, Swift Student Challenge를 위한 프로젝트 소스 코드가 안정적으로 업로드되어 있다. 'Unfiltered world.swiftpm' 패키지를 포함한 주요 파일들이 리스트업 되어 있으며, 최근 커밋 메시지를 통해 앱 이름 변경 및 에셋 마이그레이션 등의 리팩토링 작업이 완료되었음을 보여준다. 저장소 구성 및 텍스트 설명 저장소 경로: jihoon-baek / Unfiltered (Private) 최근 커밋: 백지훈 - Refactor: rename app to Unfiltered, migrate to xcassets, and int... (3분 전) 파일 목록: Unfiltered world.swiftpm: Refactor 관련 업데이트 완료 .gitignore: 시각 추적(vision tracking), 현지화(localization) 및 디자인 프로젝트 초기화 about.md: 프로젝트 상세 정보 파일 README: 'Add a README' 섹션이 활성화되어 있어 프로젝트 개요 작성을 앞두고 있는 상태임
Github 화면

그렇게 AI와 채팅을 주고받으며 완성된 초기 프로토타입이다.

초기 프로토타입

가장 먼저 만든 기능은 얼굴을 인식하고, 입을 벌리는 행위 / 귀를 막는 행위를 인식하는 기능이었다.

Swift Student Challenge 출품용 게임의 핵심 기능인 얼굴 인식 및 제스처 감지 프로토타입 테스트 화면. 전체적으로 블러(Blur) 처리가 된 인물의 상반신 화면 중앙에 얼굴 인식 포인트들이 활성화되어 있으며, 특히 입 주변의 움직임을 정교하게 추적하고 있다. 화면 하단 중앙에는 검은색 반투명 오버레이 박스가 위치하여 실시간 감지 상태를 텍스트로 표시한다. 현재 입을 벌리고 있는 상태를 인식하여 'Mouth Open' 항목은 붉은색의 'YES'로, 귀를 막지 않은 상태를 인식하여 'Covering Ears' 항목은 흰색의 'NO'로 표시되고 있는 개발 중인 인터페이스 화면이다. 주요 텍스트 설명: 실시간 인식 상태창 (하단 중앙) Mouth Open: YES (붉은색 강조) Covering Ears: NO (흰색 강조)
얼굴 인식 개발한 것을 테스트중인 화면

개발 테스트 화면에는 내 얼굴이 나오기 때문에 보여줄 수는 없지만, 양 윗입술 아랫입술, 양쪽 귀, 그리고 손바닥을 모두 인식해서 입술이 벌어지는지 여부와 귀 근처에 손바닥이 오는지 여부를 판별할 수 있는 알고리즘을 만들었다.

이 때 한가지 문제점이 발생하였다. 귀에 손을 완전히 밀착시키면 ‘손’인식이 해제된다. 즉, 손이 얼굴에 가려지는 순간 손 인식은 더 이상 작동하지 않아 귀를 덮었는지 아닌지 인식이 불가능했다. 따라서 나는 약간의 트릭을 써서 귀를 막고 있는 것이 on 으로 인식된 상태에서 손 인식이 해제되는 경우 계속하여 막고 있는 것으로 인식하도록 했다. 어차피 귀에서 손을 떼기 위해서는 다시 화면에 손이 보이고 covering-ears가 무조건적으로 해제되기 때문이다.

아래는 메인 화면이다.

우선 앱 로고는 피카소의 Le Chien 작품을 임시로 적용시켰다. 실제 로고로 활용할 계획은 아니지만 앱의 디자인 컨셉을 바탕으로, 현재 레이아웃과 디자인 시안을 보며 진행하고 싶었다.

Swift Student Challenge 출품작인 'Unfiltered' 게임의 메인 화면 디자인 시안. 전체적으로 눈이 편안한 미색(Off-white) 배경을 사용하고 있으며, 모든 그래픽 요소와 버튼 테두리는 손으로 직접 그린 듯한 검은색 드로잉 스타일로 구성되어 따뜻하고 감성적인 분위기를 준다. 화면 상단 중앙에는 가안으로 설정된 귀여운 강아지 모양의 로고가 위치하며, 그 아래로 게임 제목인 'Unfiltered'가 적혀 있다. 화면 중앙부에는 가로로 긴 두 개의 버튼이 배치되어 있고, 하단에는 언어 선택을 위한 탭이 위치한다. Unfiltered 중앙 버튼 구성 Play (플레이) About Sensory overload (감각 과부하에 대하여) 하단 언어 선택 (Tab) English (영어) - 검은색 배경에 흰색 글씨로 활성화 상태 표시 Korean (한국어) - 흰색 배경에 검은색 글씨로 비활성화 상태 표시
앱 초기 프로토타입 화면

가장 중요한 게임 화면이다.

상단에는 내가 먹어야 할 미션들이 표시된다. 지금 예시에서는 애플 로고, 물방울, 쇼핑카트를 순서대로 먹어야 한다.

중앙의 화면에서는 내가 이끄는 대로 캐릭터를 리드할 수 있다. 이 때 소리 근처에 다가가게 되면 스트레스 레벨이 상승하게 된다.

좌측 하단에는 내 카메라가 그대로 나타나고, 나는 귀를 막거나 입을 벌리는 행위를 할 수 있다.

Swift Student Challenge 출품용 'unfiltered' 앱의 초기 게임 프로토타입 실행 화면. 맥OS(macOS) 창 인터페이스 내에서 실행 중인 게임 화면으로, 전체적으로 미니멀하고 깨끗한 미트색(beige) 배경을 띠고 있다. 화면 상단에는 애플 로고, 물방울, 쇼핑카트 아이콘이 중앙에 배치되어 있고 우측 상단에는 일시정지 버튼이 있다. 중앙의 메인 게임 영역에는 파란색 원형 아이콘과 주황색 사각형 아이콘이 점선으로 연결되어 있으며, 주변에는 옅은 분홍색 원형 가이드라인과 스피커 아이콘, 회색 직사각형 장애물 등이 배치되어 그래픽 요소 간의 상호작용을 암시한다. 하단에는 'Face Status'와 'Coping Action' 섹션이 있으며, 'Use Camera'라는 텍스트가 적힌 카메라 입력 대기 영역이 존재한다. 텍스트 설명: Unfiltered (좌측 상단 창 제목) Stress Level: 0% (상단 프로그레스 바 영역) Face Status (하단 좌측 레이블) Coping Action (하단 우측 레이블) Use Camera (하단 우측 입력 영역 안내)
게임 초기 프로토타입 화면

위의 초기 기능까지 검증이 완료되고 난 이후, 실제 게임에 더 가까워지도록 계속하여 기능 개선을 진행하였다.

아래는 중간단계 이후의 게임 화면이다.

소리가 나오는 출처는 파형을 기반으로 표시되도록 만들었고, 길 또한 ‘장애물’이 길을 막는 것이 아닌, 정해진 길로만 가야한 방식으로 로직을 수정했다.

게임 프로토타입 개선 버전

여기까지 만들고 난 후 게임을 플레이해본 결과 생각보다 재미있다. 그리고 실제 자폐 스펙트럼 장애를 가지신 분들이 과감각으로 인해 일상생활이 힘든 부분을 괜찮은 수준으로 표현할 수 있겠다는 생각이 들었다.

이제 어느정도 앱 프로토타이이 완성되었다 보고, 실제 앱으로 만들기 위해 디자인 완성도를 추가하고, 기능 디테일을 추가하는 작업을 해야한다.

다음 포스트에서는 실제 앱을 만들어, 앱이 어떻게 작동되는지와 이를 Swift Student Challenge에 출품하기 위해 서류작업을 하는 과정을 공유하고자 한다.

  1. Antigravity: Google에서 만든 Visual Studio Code 기반의 AI 코딩 툴, Gemini를 기반으로 AI와 대화하며 코딩을 할 수 있다. ↩︎

이 게시글을

댓글 남기기