Daeseon Yoo
Back to project
·UX retro·4 min

신규 사용자를 무료 학습 루프로 안내

빈 Home의 일반 import CTA를 shadow, 기기 내 dictation, review로 이어지는 우선순위 경로로 바꾸고 초대 전용 AI 범위를 분명히 했다.

문제

기존 Home의 신규 사용자 분기는 아래 세 줄로 끝났다.

title: t('today.importCta'),
sub: t('today.importSub'),
onPress: () => router.push('/import'),

온보딩도 마지막 단계에서 실제 첫 성공 경로 대신 5/15/30분 일일 목표를 물었다. 저장한 영상이 있더라도 Home은 transcript 준비 상태를 보지 않아 첫 문장을 고르는 다음 행동을 안내하지 않았다.

변경

구현 커밋 90f6b9e에서 온보딩과 Home을 다음 흐름으로 맞췄다.

  1. 자막 있는 YouTube 영상을 가져온다.
  2. 한 줄을 골라 shadow한다.
  3. 기기 내 dictation으로 직접 확인한다.
  4. 생성된 review를 반복한다.

Home은 review due → 서버가 돌려준 최신 clip → transcript READY 저장 영상 → 자막 영상 import 순으로 하나의 CTA만 보여 준다. transcript가 없는 저장 영상은 막힌 상세 화면 대신 다른 영상 import로 복구한다. 기기 전역 lastClip은 사용자별 저장이 아니어서 Home 라우팅에서 제거했다.

안내 문구는 실제 확인한 gate 범위만 말한다. shadow, 기기 내 dictation, review는 초대 없이 쓸 수 있다고 설명하고, 실시간 AI 대화와 AI 답안 채점만 초대 전용으로 표시한다.

검증

실제 Home과 onboarding 모듈을 import한 임시 Vitest의 7개 흐름 테스트가 통과했다.

Test Files  1 passed (1)
Tests  7 passed (7)

mobile TypeScript 검사는 출력 없이 exit 0이었다. 최종 Expo export 출력은 다음과 같았다.

iOS Bundled 18636ms node_modules/expo-router/entry.js (1289 modules)
Exported: /private/tmp/track-a-final-rebased-ios-20260713
Android Bundled 11449ms node_modules/expo-router/entry.js (1726 modules)
Exported: /private/tmp/track-a-final-rebased-android-20260713

iOS Simulator에서 앱 내 신규 가입이 온보딩으로 자동 이동하는 것도 확인했다. 별도의 신규 로컬 계정에서는 3단계 온보딩, Home의 무료 루프 CTA, 자막 YouTube import, 첫 문장 clip, 기기 내 dictation 채점까지 실행했고 12/21 words 결과가 표시됐다. invite gate나 dead end는 없었다.

확인하지 않은 것

두 Simulator 검증은 iOS의 Save Password? 시스템 대화상자 때문에 하나의 끊김 없는 신규 가입 run으로 연결하지는 못했다. release build의 전체 first-run, 실제 shadow 녹음, review 완료는 확인하지 않았다. import 직후 transcript가 UNAVAILABLE인 상세 화면은 이번 허용 파일 범위 밖이라, Home으로 돌아왔을 때 다른 영상 import를 제안하는 복구만 추가했다.

비용 경계에도 별도 문제가 남아 있다. 현재 ClipService는 clip 생성 이벤트를 항상 발행하고, ClipAnalysisService는 provider가 설정돼 있으면 AiGate 없이 aiClient.analyzeClip()을 호출한다. 따라서 이 경로는 사용자에게 무료이지만 서버 운영비가 0인 경로로 확인되지는 않았다. 백엔드는 다른 트랙 소유이므로 이 커밋에서는 문구를 실제 gate 범위로 제한하고 코드는 변경하지 않았다.