AI면접-iOS 개발기: AI가 면접관이 되는 iOS 앱을 만들기까지
SwiftUI + SwiftData + OpenAI로 77개 iOS 면접 토픽, 음성/텍스트 모의면접, AI 피드백 시스템을 갖춘 네이티브 iOS 앱을 완성한 이야기. AI면접 시리즈 첫 번째 앱.
🎯 왜 면접 준비 앱을 만들었나
iOS 개발자 면접을 준비하다 보면, 공부할 건 많은데 정리가 안 된다. Swift 문법, 메모리 관리, 동시성, 아키텍처, SwiftUI, UIKit... 토픽만 해도 수십 개인데 각각 주니어/미드/시니어 수준이 다르다.
"77개 토픽을 체계적으로 정리하고, AI가 실제 면접처럼 질문해주면 어떨까?"
이게 출발점이었다.
🏗 기술 스택 선택: 왜 SwiftUI 네이티브인가
타이완메이트는 Flutter로 만들었지만, 이번엔 Swift 네이티브를 선택했다. 핵심 이유는 음성이다.
면접 앱의 차별점은 음성 면접 기능인데, Flutter의 음성 지원(STT/TTS)이 iOS 네이티브에 비해 확실히 떨어진다. SFSpeechRecognizer의 실시간 인식 정확도, AVAudioEngine의 세밀한 오디오 제어, AVSpeechSynthesizer의 자연스러운 음성 — 이런 것들은 네이티브에서만 제대로 쓸 수 있었다.
- SwiftUI — 선언형 UI로 빠른 화면 구성
- SwiftData — Core Data의 후계자,
@Model매크로로 간결한 데이터 모델링 - Observable 매크로 — Swift 5.9의
@Observable로 깔끔한 MVVM - async/await — 네트워크·음성 처리를 동시성으로 깔끔하게
- SFSpeechRecognizer + AVAudioEngine — Flutter 플러그인으로는 대체 불가능한 네이티브 음성 품질
데이터 영속화를 SwiftData로 통일한 덕분에 면접 기록, 학습 진도, 퀴즈 오답, 스트릭 등이 모두 로컬에서 관리된다.
📱 앱 구조: 5개 탭
🏠 홈 · 🎤 AI면접 · 📝 복습 · 📊 대시보드 · ⚙️ 설정
홈 탭 — 77개 토픽 브라우징
12개 카테고리(Swift 언어, 메모리 관리, 동시성, 디자인 패턴, 아키텍처, 반응형 프로그래밍, UIKit, SwiftUI, 네트워킹, 앱 라이프사이클, 테스트, CS 기초)로 분류된 77개 토픽. 난이도 필터(Junior/Mid/Senior)로 내 수준에 맞는 토픽만 볼 수 있다.
데일리 챌린지 — AI가 학습 갭을 분석해서 매일 추천 토픽을 하나 골라준다. "오늘은 이거 공부하세요."
AI면접 탭 — 진짜 면접처럼
가장 공들인 기능이다. 두 가지 모드를 지원한다:
음성 면접: iOS 네이티브 SFSpeechRecognizer로 STT, AVSpeechSynthesizer + OpenAI TTS로 면접관 음성 재생. 실제 면접처럼 말로 답하고 AI가 음성으로 피드백한다.
텍스트 면접: 타이핑으로 답변. 코드 블록이나 긴 설명이 필요한 질문에 적합하다.
4가지 분위기 설정이 있다:
- 편안한 — 친절한 멘토 스타일
- 보통 — 일반적인 면접관
- 깊이 파기 — 꼬리 질문을 계속하는 전문가
- 압박 — 틀린 부분을 날카롭게 지적하는 면접관
면접이 끝나면 AI가 전체 답변을 평가하고, 점수와 등급을 매기고, 부족한 부분을 짚어준다. 면접 결과는 PDF로 내보내기해서 공유할 수도 있다.
토픽 상세 — 5개 서브 탭
각 토픽을 열면 5개 탭으로 깊이 학습할 수 있다:
- 개념 — 쉬운 설명 + 실전 예시 + 심화 내용
- Q&A — 실제 면접 질문 + 모범 답안
- 퀴즈 — 객관식으로 이해도 확인
- AI 채팅 — 모르는 것 바로 질문
- 음성 면접 — 해당 토픽 집중 연습
🤖 AI 백엔드: Supabase Edge Functions
AI 기능은 직접 OpenAI API를 호출하지 않고, Supabase Edge Functions를 프록시로 사용했다.
- API 키가 클라이언트에 노출되지 않음
- Rate limiting으로 남용 방지
- 프롬프트 관리를 서버에서 통일
면접 평가, AI 채팅, TTS 음성 생성이 모두 Edge Function을 거친다.
🌐 이중 언어: 한국어 + 영어
모든 콘텐츠가 한국어와 영어를 지원한다. 77개 토픽의 개념 설명, Q&A, 퀴즈까지 전부 이중 언어. 설정에서 언어를 바꾸면 즉시 전환된다.
해외 취업을 준비하는 한국인 개발자도, 한국 취업을 준비하는 영어권 개발자도 쓸 수 있게 만들었다.
🎨 테마 시스템: 다크 / 라이트
2가지 테마를 지원한다:
- 다크 모드 — 기본 테마, 장시간 학습에 눈이 편하다
- 라이트 모드 — 밝은 환경용
ThemeManager로 전역 관리하고, 카테고리별 고유 컬러 코드(Swift는 #F05138, 메모리 관리는 #8B5CF6 등)로 시각적 구분을 줬다.
📊 대시보드: 스트릭 + 카테고리 분석
대시보드에서 학습 현황을 한눈에 볼 수 있다:
- 스트릭 추적 — 연속 학습 일수와 최장 기록
- 전체 진도율 — 77개 토픽 중 얼마나 학습했는지
- 카테고리별 분석 — 12개 카테고리 각각의 진도와 강약점
- 학습 통계 — 총 학습 시간, 연습 횟수, 퀴즈 정답률
📝 복습 시스템
틀린 퀴즈와 북마크한 Q&A를 따로 모아 복습할 수 있다. 면접 준비에서 **"틀린 것을 다시 보는 것"**이 가장 효율적이라는 걸 반영했다.
🔊 TTS 음성 선택
면접관 목소리를 6가지 중에 선택할 수 있다: alloy, echo, fable, onyx, nova, shimmer. 각각 톤과 분위기가 다르다. 실제 면접에서 다양한 면접관을 만나는 것처럼, 익숙하지 않은 목소리에도 적응하는 연습이 된다.
🏗 프로젝트 구조
ai-interview-ios/
├── Models/ — SwiftData 모델 7개
├── ViewModels/ — MVVM 뷰모델 9개
├── Views/ — 홈, AI면접, 복습, 대시보드, 설정, 토픽 상세, 온보딩
├── Services/ — OpenAI, STT, TTS, 일일챌린지, 진도, 프리미엄
├── Theme/ — 테마 매니저 + 앱 테마 + 공유 컴포넌트
└── Utilities/ — 상수, AppConfig(77토픽 정의), Extensions
📊 숫자로 보는 AI면접-iOS
| 항목 | 수치 |
|---|---|
| 면접 토픽 | 77개 |
| 카테고리 | 12개 |
| 난이도 레벨 | 3단계 (Junior/Mid/Senior) |
| 면접 분위기 | 4가지 (편안/보통/깊이파기/압박) |
| 면접 모드 | 2가지 (음성/텍스트) |
| TTS 음성 | 6종 |
| 테마 | 2가지 (다크/라이트) |
| 지원 언어 | 2개 (한국어/영어) |
| 최소 iOS | 17.0+ |
🎯 회고
잘한 점
- SwiftData + Observable 매크로 조합이 잘 맞았다. Core Data 시절보다 코드량이 절반 이하로 줄었다.
- 음성 면접 기능이 차별점이 됐다. 텍스트로만 연습하는 것과 말로 답하는 건 체감이 완전히 다르다.
- 77개 토픽의 체계적 분류. 12개 카테고리 × 3단계 난이도로 빠짐없이 커버했다.
아쉬운 점
- 테스트 코드가 없다. 뷰모델 단위 테스트라도 있었으면 유지보수가 편했을 것.
- 프리미엄 기능의 StoreKit 2 연동이 아직 미완성. 앱스토어 출시 전에 마무리해야 한다.
다음 계획
- StoreKit 2 결제 연동 + AdMob 광고 적용
- App Store 출시
- AI면접 시리즈 확장: AI면접-Android, AI면접-Flutter 등 플랫폼별 면접 앱 개발
💬 마무리
iOS 개발자로서 "내가 쓸 앱"을 만든 건 이번이 처음이다. 면접 준비를 하면서 동시에 면접 준비 앱을 만드는, 일종의 메타적 경험이었다.
"면접 공부를 하면서 앱을 만들고, 앱을 만들면서 면접 공부가 된다."
SwiftUI의 선언형 패턴, SwiftData의 @Model 매크로, async/await 동시성 — 이런 걸 앱에 구현하면서 동시에 면접 토픽으로 정리하는 게 꽤 효율적이었다.
AI 면접관에게 압박 면접 당하면서 만든 앱이니, 다른 iOS 개발자들에게도 도움이 되면 좋겠다.