"배포"는 두 갈래로 나뉩니다: 앱을 휴대폰에 올리는 것과 백엔드를 인터넷에 올리는 것.
3.1 앱 배포 채널
| 채널 | 비용 | 심사 | 누구에게 적합한가 |
|---|---|---|---|
| Apple App Store | 연 $99 개발자 계정 | 있음 (수 시간~수 일) | 공개 iOS 출시 |
| Google Play Store | 일회 $25 | 있음 (수 시간~수 일) | 공개 Android 출시 |
| TestFlight (Apple) | 개발자 계정에 포함 | 가벼운 베타 심사 | iOS 베타 테스터 최대 10,000명 |
| Google Play 내부/비공개 테스트 | 포함 | 가벼움 | Android 베타 테스트 |
| EAS Update (OTA) | Expo 무료 티어 | 스토어 심사 없음 | 설치된 앱에 JS 수준 업데이트를 즉시 전달 |
| 직접 배포 | 무료 | 없음 | Expo Go(개발), Android APK 사이드로드, 기업 내부 배포 |
핵심 개념 — OTA(Over-The-Air) 업데이트: Expo를 쓰면 앱의 JavaScript 레이어를 EAS Update에 게시하는 것만으로 즉시 업데이트할 수 있습니다. 사용자는 다음 실행 때 새 버전을 받습니다. 스토어 심사가 필요 없죠. 단, 네이티브 코드 변경(새 권한, 새 네이티브 라이브러리)이 있을 때만 새 스토어 빌드가 필요합니다.
3.2 스토어 출시는 이렇게 흘러갑니다 (파이프라인)
- 빌드: 릴리즈 바이너리 만들기 — iOS는
.ipa, Android는.aab. 우리는 클라우드에서 EAS Build를 사용하므로 Mac이 없어도 됩니다. - 제출: 스토어에 올리기 — EAS Submit 사용
- 심사: Apple/Google의 검토(콘텐츠 정책, 개인정보 처리방침 확인 — 로깅 앱은 개인정보 처리방침 URL이 필수입니다)
- 출시: 대중 또는 베타 테스터에게 공개
- 반복: 빠른 수정은 EAS Update로
3.3 백엔드 배포 — Cloudflare
우리 앱은 로그 저장과 LLM 호출을 위해 서버가 필요합니다. API 키는 절대 모바일 앱 안에 넣으면 안 됩니다 — 출시된 앱 바이너리에서 누구든 추출할 수 있기 때문입니다. Cloudflare의 서버리스 플랫폼을 사용합니다:
| Cloudflare 제품 | MindLog에서의 역할 | 무료 티어 |
|---|---|---|
| Workers | 서버리스 API — 로그 수신, OpenRouter 호출, 날씨 조회 | 하루 100,000회 요청 |
| D1 | 서버리스 SQL 데이터베이스 — 일기와 일별 로그 저장 | 넉넉한 무료 읽기/쓰기 |
| Workers AI / AI Gateway | 선택: LLM 호출의 분석 및 라우팅 | 무료 |
| Pages | 선택: 개인정보 처리방침 페이지 호스팅(스토어 필수) | 무료 |
이 워크숍에서 Cloudflare를 선택한 이유: 서버 관리가 전혀 없고, 진짜 무료 티어가 있으며,
wrangler deploy 한 번이면 초 전 세계 배포가 완료됩니다. API가 전 세계 사용자와 가까운 데이터센터에서 실행됩니다.
3.4 LLM 레이어 — OpenRouter + Nemotron 3.5 Lightning
OpenRouter는 수백 개의 AI 모델에 대한 통합 API 게이트웨이입니다. 하나의 API 키, 하나의 OpenAI 호환 엔드포인트(https://openrouter.ai/api/v1/chat/completions)로 사용량만큼 과금됩니다. 우리는 nvidia/nemotron-3.5-lightning:free를 호출합니다 — Nvidia의 빠르고 가벼운 모델로, 현재 OpenRouter에서 무료로 제공됩니다. API 키만 있으면 별도 비용 없이 사용할 수 있어 초보자 워크숍에 최적입니다. OpenRouter를 경유하므로 나중에 모델을 바꾸고 싶을 때도 코드 한 줄만 수정하면 됩니다.
강사 설명 포인트: 이 아키텍처 패턴을 보세요 — 얇은 클라이언트, 똑똑한 서버. 휴대폰 앱은 단순한 UI이고, 모든 비밀과 비즈니스 로직은 Cloudflare Worker에 있습니다. 거의 모든 프로덕션 AI 앱의 뒤에는 이 패턴이 있습니다.