← Back to Devlog
🚀2026년 04월 01일 (Wednesday)

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개 탭으로 깊이 학습할 수 있다:

  1. 개념 — 쉬운 설명 + 실전 예시 + 심화 내용
  2. Q&A — 실제 면접 질문 + 모범 답안
  3. 퀴즈 — 객관식으로 이해도 확인
  4. AI 채팅 — 모르는 것 바로 질문
  5. 음성 면접 — 해당 토픽 집중 연습

🤖 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개 (한국어/영어)
최소 iOS17.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 개발자들에게도 도움이 되면 좋겠다.