출퇴근 영어 회화 앱 — 기획서 (PRD) v0.2
작성일: 2026-09-13 · 상태: 검토 회의 반영본 · 기준: v0.1 + 제품검토 회의(2026-09-13) 표기: [결정] 확정 · [제안] 검토 필요 · [확인 필요] 정보 요청 변경 이력: v0.1 초안 → v0.1.1 스택 변경 → v0.2 6인 검토 반영
0. v0.1 대비 변경 요약
| # | 변경 | 절 |
|---|---|---|
| C1 | 착수 전 선행 검증 2주 신설 — 발화 수용도·수요·가격 | 9 |
| C2 | 걷기 모드를 "통화하는 척" UX로 프레이밍, 속삭임 볼륨 허용 | 5.4 |
| C3 | 지하철 모드를 혼잡도 2모드(화면/오디오)로 분기 | 5.3 |
| C4 | 루틴 생성기에 간격 반복(SRS) 내장 (신규 40 / 복습 60) | 5.2 |
| C5 | 레벨 진단 제거 → 상황 선택으로 대체, 3일 후 자동 보정 | 5.1 |
| C6 | 레슨에 Curveball(예상 밖 되물음) 요소 추가 — 리스닝 강화 | 6 |
| C7 | 발음 점수 폐기 → 이진 판정 + 저소음 환경 한정 상세 피드백 | 5.4 |
| C8 | 로컬 알림을 P0로 상향 (P2 → P0) | 5.7 |
| C9 | 수익 모델 확정 — 무료 / Pro 12,900 / 여행 패스 29,000 | 10 |
| C10 | 북극성 지표를 주간 발화 문장 수(WSU)로 변경 | 11 |
| C11 | 여행 코스 억양 믹스를 기본 사양으로 (동남아·일본 우선) | 6 |
| C12 | 스트릭 보호 장치 + 이어폰 없는 날 모드 추가 | 5.6 |
| C13 | 리스크에 사회적 장벽·블루투스 음질 저하 추가 | 12 |
1. 개요
한 줄 정의
출퇴근 동선(지하철 + 도보)에 맞춰 자동으로 짜이는 루틴으로, 이동만 해도 일상·여행 영어 회화가 입에 붙는 앱.
해결하려는 문제
- 직장인은 따로 앉아서 공부할 시간을 내기 어렵고, 꾸준히 이어가지 못한다.
- 회화 앱을 써도 실제로 말해볼 기회가 부족하다.
- 기존 앱은 "집중해서 앉아 있는 15분"을 전제로 설계되어, 끊기고 흔들리는 이동 환경에 맞지 않는다.
- [v0.2 추가] 배운 표현이 다시 나오지 않아, 인지는 해도 입에서 나오지 않는다.
- [v0.2 추가] 준비한 문장은 말해도, 상대의 예상 밖 되물음에서 무너진다.
목표
- 사용자가 출퇴근 시간만으로 주 5회 이상 학습을 지속한다.
- 걷기 구간을 활용해 매일 실제로 영어 문장을 소리 내어 말한다. (주 50문장)
이 제품이 성립하기 위한 전제 [검증 대상]
- 타깃 사용자가 길에서 이어폰을 끼고 영어를 소리 내어 말할 의향이 있다.
- 걷기 중 소음 환경에서 음성 인식이 실용 수준으로 동작한다.
- 블루투스 이어폰에서 재생 음질을 유지한 채 녹음 전환이 가능하다.
세 전제 모두 v0.1에서 미검증 상태로 개발 계획에 포함되어 있었다. v0.2는 (1)을 선행 검증 2주, (2)(3)을 M1 스파이크 게이트로 분리한다. → 9장
2. 타깃 사용자
- [결정] 주 타깃: 대중교통으로 출퇴근하는 직장인
- [결정] 학습 목적: 일상·여행 회화
- [결정 v0.2] 레벨은 사전에 묻지 않는다. "어떤 상황이 막막한지"로 시작 지점을 정하고, 첫 3일 행동 데이터(퀴즈 정답률, 발화 성공률)로 자동 보정한다.
- 근거: 3문항 자기 진단은 변별력이 없고, 성인 학습자는 자기 레벨을 정확히 모른다. 온보딩 마찰만 늘린다.
대표 페르소나
김지은 (32, 마케터) — 지하철 25분 + 도보 10분 출퇴근. 연 1~2회 해외여행을 가는데 매번 식당·호텔에서 말문이 막힌다. 영어 앱을 여러 번 깔았지만 2주를 못 넘겼다. 퇴근길엔 지쳐서 뭘 "공부"하고 싶지 않다.
[v0.2 추가] 지은의 실제 실패 장면: 방콕 호텔 체크인. "I have a reservation under Kim"까지는 나왔다. 직원이 "Would you like a city view or pool view?"라고 되묻자 굳었다. 문장을 만들지 못한 게 아니라 못 알아들어서 막혔다.
반(反)타깃
- 시험(토익·오픽) 점수를 목표로 하는 사용자 — 본 제품은 점수 대비를 하지 않는다.
- 자가용 출퇴근자 — 걷기 구간이 없어 핵심 루프가 성립하지 않는다. (차량은 M3 범위에서 명시적 제외 → 아래 "사용 환경 범위")
- 이어폰을 쓰지 않는 사용자.
사용 환경 범위 [결정 2026-09-19]
근거: 2026-09-19 #제품 회의(전원 동의)와 같은 날 백승현 부대표 결재. 부대표 결재가 "대표 최종 확정을 기다리지 않고 PRD 범위 절 반영을 즉시 착수" 로 닫았으므로, 아래 세 줄은 확정 문장으로 쓴다. 대표 최종 확정만 미결 U8(13장)로 따로 추적한다.
표기: "M3 범위" 는 회의 표현을 그대로 옮긴 것이다. 개발계획서 마일스톤 번호로는 걷기가 M3, 지하철 2모드가 M5이므로 여기서 말하는 M3 범위는 마일스톤 M3 하나가 아니라 MVP에서 만드는 이동 환경 전체를 가리킨다.
- [결정] M3 범위는 지하철 2모드(화면 모드 / 오디오 모드) + 걷기다. 이 둘 외의 이동 환경은 M3에서 만들지 않는다.
- [결정] 차량(운전 중)은 M3 범위에서 명시적으로 제외하고, 재논의 트리거를 두지 않는다.
- 근거 (a) 걷기 구간이 없어 "지하철=입력 / 걷기=출력" 의 SRS 루프가 성립하지 않는다 (b) 운전자 주의분산을 설계로 막을 수단이 없다 — 걷기 모드의 "화면을 켜면 자동 일시정지"(5.4 안전)에 해당하는 구조적 장치가 운전에는 없다.
- 트리거를 두지 않는다는 것은, 선행 검증·M1 결과가 어떻게 나오든 차량을 자동으로 다시 열지 않는다는 뜻이다. 되살리려면 이 줄을 고치는 별도 결정이 필요하다.
- [이력] v0.1~v0.2 초안이 3단계·P2 항목으로 적어 둔 "운전 모드" 는 이 결정으로 폐기됐다(로드맵 9장 이후 · 5.10에서 삭제).
- [결정] 러닝은 M3 범위에서 명시적으로 제외하되, 재논의 트리거는 남긴다. 조건은 아래 표 한 자리에 모은다.
러닝 재논의 트리거 — 이 표가 러닝 재논의 조건의 유일한 자리다.
| 항목 | 내용 |
|---|---|
| 입력 | 선행 검증 설문 2문항의 분포 — (1) 지난주 실제 러닝 횟수(행동 빈도형) (2) 출퇴근 외 쓰고 싶은 곳(희망형). 두 응답의 격차 자체를 러닝 수요 지표로 쓴다. 문항 추가는 정민우 CGO 몫이고(2026-09-19 회의 다음 액션), 2026-09-19 현재 docs/선행검증_모집/02_스크리닝_문항_초안.md §4 에 S17·S18 로 들어가 있다(선별에 쓰지 않는 참고 문항 — 선정에는 반영하지 않는다). 선택지 최종 문구 확정은 폼 개설 전 정민우 CGO 몫으로 남아 있다 |
| 판정 주체 | 강시영 대표 (commute-probe #70) |
| 판정 시점 | M1 게이트(W3) 당일 |
| 판정 전 기본 상태 | 트리거 미발동. 판정 전까지 러닝 관련 설계·추정 작업은 착수하지 않는다 |
| 발동 시 비용 | M1 매트릭스 재실측 2주 (걷기 수치 승계 불가) + 무입력 조작(음성 / 이어폰 버튼) 설계 추가 |
| 사전 임계 숫자 | 두지 않는다. 2026-09-19 부대표 결재가 "사전 숫자로 고정하지 않는다" 로 닫았다 — 산출 근거 없는 숫자는 판단을 돕지 않고 앵커로 굳는다 |
3. 핵심 가치와 차별점
| 구분 | 기존 회화 앱 | 우리 앱 |
|---|---|---|
| 학습 시간 | 사용자가 따로 시간 확보 | 출퇴근 동선 자체가 학습 시간 |
| 분량 | 고정 레슨 | 탑승·도보 시간 + 혼잡도에 맞춰 자동 조절 |
| 말하기 | 앉아서, 화면 보며 | 걸으면서, 화면 없이 (오디오 전용) |
| 복습 | 진도 중심, 복습은 사용자 몫 | 간격 반복 내장 — 걷기 구간이 곧 복습 |
| 듣기 | 정돈된 표준 발음 | 상황별 억양 믹스 (인도·필리핀·일본·싱가포르) |
| 대비 범위 | 내가 할 말 | 상대의 되물음(Curveball)까지 |
| 동기 | 연속 학습일 | 여행 D-day 역산 + 보호 장치 있는 스트릭 |
[결정] 핵심 구조: 지하철은 입력, 걷기는 출력. [결정 v0.2] 방어 가능한 차별점 3가지: (a) 동선 기반 자동 루틴 (b) 억양 믹스 리스닝 (c) Curveball 대응 훈련
4. 사용 시나리오
출근길 (에너지 있음 → 새 표현 입력)
4-A. 자리가 있거나 여유 있을 때 — 화면 모드 1. 출근 시각 10분 전 알림: "오늘은 호텔 체크인이에요." 2. 지하철 탑승 후 앱을 열면 레슨이 바로 시작된다. (3초 안에) 3. 신규 표현 2~3개 + 복습 표현 3~4개를 카드로 익힌다. 4. 표현이 쓰인 대화를 자막과 함께 본다. 대화 끝에 Curveball 2~3개 — "이렇게 되물어올 수 있어요." 5. 하차 역 근처에서 짧은 확인 퀴즈.
4-B. 만원 지하철 — 오디오 모드 1. 진입 시 "서 있어요" 1탭 → 화면 조작 없이 오디오만 진행. 2. 오늘 표현 미리듣기 → 대화 흘려듣기 → Curveball 듣기. 3. 퀴즈 없음. 하차 시 "걷기 모드 시작할까요?" 알림 1개.
공통 — 도보 구간: 걷기 모드 (핵심 루프) 1. 이어폰으로 자동 이어짐. 화면은 자동으로 꺼진다. 2. "통화하듯 편하게 말하면 됩니다. 이어폰 끼고 있으면 통화 중으로 보여요." 3. 원어민 음성 → 비프 → 따라 말하기 → "좋아요, 다음." 4. 문장은 복습 큐에서 우선 추출된다. 오늘 배운 것 + 3일 전 것 + 7일 전 것. 5. 중간에 Curveball 응답 훈련 1~2회: "Would you like a city view or pool view?" → 답해보세요.
퇴근길 (피곤함 → 가벼운 복습)
- 기본값 오디오 모드. 아침 표현이 들어간 대화를 듣기만 한다.
- 걸으면서 한두 문장만 따라 말하면 오늘 루틴 완료.
- 출근 루틴의 절반 이하 부담.
예외 시나리오 [v0.2 추가]
| 상황 | 동작 |
|---|---|
| 이어폰을 안 가져온 날 | "이어폰 없는 날 모드" — 무음 읽기 + 퀴즈. 스트릭 인정 |
| 재택근무 / 휴가 | "오늘은 출퇴근 안 해요" → 짧은 홈 루틴 대체. 스트릭 인정 |
| 주말·공휴일 | 스트릭 계산에서 자동 제외 |
| 하루 빠짐 | 주 1회 자동 스트릭 프리즈 |
| 통화·알람 인터럽트 | 자동 일시정지, 종료 후 재개 확인 |
5. 기능 요구사항
우선순위: P0 = MVP 필수 · P1 = 2단계 · P2 = 이후
5.1 온보딩 (P0)
- [변경 v0.2] 레벨 진단 문항 제거. 대신 "어떤 상황이 제일 막막하세요?" — 공항 / 식당 / 호텔 / 길찾기 / 회사 스몰톡 중 선택 → 시작 코스 결정
- 출퇴근 정보 입력: 슬라이더 + 기본값 (탑승 25분 / 도보 10분), "대충이면 됩니다" 문구
- 출근·퇴근 시각 입력 (알림 트리거로 사용)
- 여행 목표 입력 (선택): 여행지, 출발일
- [결정] 가입 전 체험 — 첫 레슨을 끝까지 완료한 뒤에 가입을 묻는다
- [결정 v0.2] 알림 권한은 온보딩이 아니라 첫 레슨 완료 직후 요청 (수락률 차이 큼)
- 목표: 입력 60초 이내
5.2 데일리 루틴 생성 (P0)
- 입력: 탑승 시간, 도보 시간, 혼잡도 모드, 레벨(자동 보정값), 복습 큐, 여행 목표
- [신규 v0.2] 간격 반복(SRS) 내장
- 기본 배분: 신규 40% / 복습 60% (첫 주는 신규 70%에서 시작해 점진 이동)
- 복습 간격: 1일 → 3일 → 7일 → 16일 → 35일
- 발화 성공 시 다음 단계 진급, 실패 시 1단계 강등
- 걷기 구간 문장은 복습 큐에서 우선 추출 (걷기 = 출력 연습)
- 시간 기반 배치: 레슨 요소별 예상 소요 시간 상수 사용 (표현 카드 1개 ≈ 1분, 따라 말하기 1문장 ≈ 20초)
- 여행 목표: D-day까지 남은 출퇴근 횟수 ÷ 남은 상황 수로 페이스 계산. 부족하면 복습 비중을 40%까지 축소
- [결정 v0.2] 첫 주 실제 사용 시간 데이터로 탑승·도보 시간 자동 보정 제안
5.3 지하철 모드 (P0) — 혼잡도 2모드
[변경 v0.2] 단일 화면 모드 → 2모드 분기. 진입 시 1탭 선택, 마지막 선택을 기억하되 매번 변경 가능. 퇴근 기본값은 오디오 모드.
5.3.1 화면 모드 - 표현 카드: 영어 문장, 한국어 뜻, 원어민 음성, 사용 상황 한 줄 - 대화 보기: 4~8턴, 자막 토글 - Curveball 섹션: "이렇게 되물어올 수 있어요" 2~3개 + 대응 표현 - 확인 퀴즈: 빈칸 채우기 / 상황에 맞는 표현 고르기 - [변경 v0.2] 조작: 스와이프를 주 조작에서 제외. 최소 64pt 탭 타겟, 화면 하단 40% 영역에 배치 - 근거: 지하철 흔들림·급정거에서 오작동 빈발 - 무음 대응: 이어폰 미연결 시 자막 중심 진행 - 중단 복구: 앱 전환·통화 후 이어서 시작
5.3.2 오디오 모드 (신규) - 화면 조작 없이 재생만. 오늘 표현 미리듣기 → 대화 흘려듣기 → Curveball 듣기 - 퀴즈 없음 - 하차 예상 시점에 "걷기 모드 시작할까요?" 알림 1회
5.4 걷기 모드 — 오디오 (P0, 핵심 루프)
[변경 v0.2] v0.1에서 "P0 단순 → P1 완전"으로 나뉘어 있던 것을 P0 통합. 이 앱의 핵심 차별점을 MVP에서 빼면 검증 자체가 불가능하다.
사회적 장벽 대응 [신규 v0.2 — D1] - 첫 진입 시 명시적 안심 메시지: "이어폰을 끼고 있으면 통화 중으로 보입니다. 아무도 신경 쓰지 않아요." - 볼륨 기준을 "통화하듯이"로 제시. "크게 따라 하세요" 문구 금지 - 속삭임 볼륨을 정상 사용으로 취급 — 인식 감도를 그에 맞춰 조정 - 마이크 달린 이어폰 착용을 권장 흐름에 포함
기본 동작 - 화면 잠금·주머니 속 상태에서 재생 유지 - 이어폰 버튼 제어: 재생/일시정지, 다음("알아요, 넘기기"), 이전("다시 듣기") - 음성 안내만으로 진행 ("따라 해보세요… 좋아요, 다음 문장") - 흐름: 원어민 음성 → 비프 → 녹음·인식 → 판정 → 음성 피드백 - Curveball 응답 훈련: 세션당 1~2회 무작위 삽입
발음 판정 [변경 v0.2 — D5] - 점수 표시 폐기. 근거: 도심 소음 70~80dB + 비원어민 발음에서 STT 오류율이 40%를 넘어, 잘 말해도 틀렸다고 나온다. 점수는 신뢰를 무너뜨린다 - 1차(기본): 이진 판정 — "말했다 / 안 들렸다". 인식 신뢰도가 낮으면 통과 처리 (관대한 쪽으로) - 2차(조건부): 상세 피드백 — 마이크 입력 SNR이 임계값 이상(조용한 환경)일 때만 단어별 하이라이트. Pro 기능 - 진행 지표는 정확도가 아니라 누적 발화 문장 수
안전 [강화 v0.2] - 걷기 모드 진입 시 화면 자동 소등 - 화면을 켜면 자동 일시정지 — 재개하려면 명시적 탭. 보면서 걷는 것을 구조적으로 불편하게 - 경고 문구만으로는 부족하다는 판단. 설계로 막는다
5.5 오프라인 (P0)
- 당일 루틴(텍스트 + 음성 파일)을 Wi-Fi 연결 시 자동 다운로드
- 항상 "오늘 + 내일" 분량 보관, 7일 지난 음성 파일 정리
- 터널·지하 구간에서도 끊김 없이 진행, 학습 기록은 로컬 저장 후 동기화
- [v0.2] 무료 플랜은 당일 분량, Pro는 전체 코스 선다운로드
5.6 학습 기록·습관 (P0)
- 연속 학습일(스트릭), 주간 출퇴근 학습 횟수
- 여행 모드: "출발까지 출퇴근 N회 · 완주한 상황 M/전체"
- [신규 v0.2] 스트릭 보호 장치
- 주말·공휴일 자동 제외
- 스트릭 프리즈 주 1회 자동 지급
- "오늘은 출퇴근 안 해요" 버튼 → 홈 루틴 대체, 스트릭 인정
- 스트릭이 깨졌을 때 문구를 "0일부터 다시"가 아니라 "이번 달 12일 학습했어요" — 누적 지표를 전면에
- 근거: 출퇴근 기반 앱은 구조적으로 스트릭이 자주 깨지고, 깨지는 순간이 최대 이탈 지점
- [신규 v0.2] 이어폰 없는 날 모드 — 무음 읽기 + 퀴즈 중심 짧은 루틴, 스트릭 인정
5.7 알림 (P0) [승격 v0.2 — D2: P2 → P0]
근거: 이 앱의 트리거는 "매일 같은 시각, 같은 장소에서 시작되는 행동"이다. 습관 형성의 교과서적 조건인데, 이를 붙잡을 알림이 2단계에 있으면 앞뒤가 맞지 않는다. 학원 운영의 핵심이 커리큘럼이 아니라 결석 관리인 것과 같다.
- 로컬 알림만 P0 (서버 불필요, 구현 비용 낮음)
- 출근 시각 10분 전 / 퇴근 시각 10분 전
- 문구에 오늘 상황 포함: "오늘은 카페에서 주문하기예요"
- 권한 요청 시점: 첫 레슨 완료 직후
- 원격 푸시(FCM/APNs, 서버 발신 캠페인)는 2단계 유지
5.8 결제·구독 (P0) [신규 v0.2]
- 무료 / Pro 구독 / 여행 패스 단품 → 10장
- 인앱 결제 (App Store / Google Play)
- 페이월 노출 지점: (a) 잠긴 코스 진입 (b) 여행 D-day 화면 (c) 상세 발음 피드백 시도
5.9 AI 롤플레이 (P1)
- 걷기 구간에서 AI 상대와 짧은 상황극
- 오늘 배운 표현을 쓰도록 유도, 종료 후 한 줄 피드백
- 네트워크 필요 → 연결 가능 시에만 활성화
- Pro 전용, 일일 횟수 제한
5.10 이후 검토 (P2)
- 원격 푸시 기반 캠페인 (복귀 유도, 신규 코스 안내)
- 실제 지하철 노선·역 연동으로 하차 역 기준 분량 자동 조정
- 가속도계 기반 자동 모드 전환 (정지=지하철 / 보행=걷기)
- 지하철 속삭임 모드
- 친구와 여행 코스 같이 하기
차량(자가용 출퇴근자)은 2026-09-19 결정으로 P2에서도 뺐다. 이후 검토 대상이 아니라 범위 밖이다 → 2장 "사용 환경 범위"
6. 콘텐츠 설계
구조 [변경 v0.2 — Curveball 추가]
코스 (예: 여행 필수 / 일상 스몰톡)
└ 상황 (예: 호텔 체크인)
└ 레슨 (1회 출퇴근 분량)
├ 핵심 표현 3~5개 (내가 할 말)
├ Curveball 3~5개 [신규] (상대가 되물을 말 + 대응)
├ 대화문 1개 (4~8턴)
├ 퀴즈 3~5문항
└ 따라 말하기 문장 5개 (걷기용 — SRS 큐에서 추출)
Curveball — 설계 의도 [신규 v0.2]
여행 영어의 실제 실패 지점은 "내 문장을 못 만들어서"가 아니라 "상대의 되물음을 못 알아들어서"다. 호텔 체크인의 I have a reservation under Kim은 대부분 말할 수 있다. 무너지는 곳은 다음이다.
"Do you want a city view or a garden view?" "Are you paying with the card on file?" "We have you down for two nights, is that right?" "Can I get a card for incidentals?"
상황마다 실제로 자주 나오는 되물음 3~5개를 별도 학습 요소로 두고, 걷기 모드에서 무작위 재생 → 응답 훈련한다.
억양 믹스 [신규 v0.2 — 차별점]
한국인이 실제로 영어를 쓰는 곳은 미국이 아니라 방콕·다낭·도쿄·싱가포르다. 상대는 원어민이 아니다.
- 여행 코스는 상황별로 미국/영국 외 최소 1개 비원어민·지역 억양 화자를 포함한다
- 대상 억양: en-IN(인도), en-PH(필리핀), en-SG(싱가포르), en-AU(호주), 일본식 영어
- 클라우드 TTS가 해당 보이스를 지원하며 비용 차이는 없다
- 마케팅 메시지로도 사용 가능: "표준 발음만 들으면 현지에서 못 알아듣습니다"
초기 상황 목록
- 여행(우선): 공항 체크인·보안검색, 기내, 입국심사, 호텔 체크인·요청, 식당 주문, 카페, 길 묻기, 대중교통, 쇼핑·계산, 문제 상황(분실·아플 때)
- 일상: 스몰톡(날씨·주말), 자기소개, 부탁하기, 추천 묻기, 감정 표현
- [결정 v0.2] 우선 지역: 동남아·일본 — 실제 여행 빈도가 가장 높고, 억양 믹스 차별점이 가장 잘 드러남
제작 방식 [구체화 v0.2]
- 초안은 Claude로 생성 → 원어민 검수
- [신규] 콘텐츠 스타일 가이드를 먼저 문서화 (검수 기준 없이는 검수자마다 결과가 다름)
| 기준 | 내용 |
|---|---|
| 교과서체 금지 | "Could you possibly tell me where..." → "Where's...?" |
| 축약형 필수 | "I am going to" → "I'm gonna" (표기 병기) |
| 문장 길이 | 12단어 이하 |
| 완결문 강박 금지 | 실제 대화의 절반은 단어 한두 개 + 억양 |
| 2단 제공 | 상황마다 "공손 버전 / 편한 버전" |
- [결정 v0.2] 핵심 100문장은 실제 원어민 성우 녹음, 나머지는 고품질 TTS
- 근거: TTS는 단어는 정확하나 대화의 리듬(겹침, 망설임, filler)이 없다. 따라 말하기 모델로는 부자연스럽다
- 예상 비용: 30~50만원 (2~3시간 세션)
- 음성: 상황별 화자 2명 이상(성별·억양 다양화)
7. UX 원칙
- 3초 안에 시작: 앱을 열면 메뉴가 아니라 오늘 레슨이 바로 나온다.
- 한 손, 엄지 영역, 큰 타겟: 서서 손잡이 잡은 상태 기준. 제스처가 아니라 64pt 이상 탭 타겟.
- 언제 끊겨도 괜찮게: 모든 단계는 1분 이내 단위, 중단 지점 자동 저장.
- 걷기는 화면 없이: 화면 자동 소등. 화면을 켜면 자동 일시정지.
- 퇴근길은 가볍게: 퇴근 루틴은 출근 루틴의 절반 이하 부담.
- [신규] 못 한 날을 벌하지 않는다: 스트릭 보호, 대체 모드, 누적 지표 전면화.
- [신규] 관대하게 판정한다: 틀렸다고 하는 것보다 넘어가는 쪽이 낫다. 목표는 평가가 아니라 발화량이다.
8. 기술 설계 (요약 — 상세는 개발계획서 v0.2)
스택
- 앱: React Native CLI (bare) + TypeScript
- 백엔드: Supabase (인증, DB, 스토리지)
- 오디오: react-native-track-player 계열
- 음성 인식: 인터페이스 추상화 — MVP는 네이티브 STT(iOS Speech / Android SpeechRecognizer), Whisper 온디바이스는 폴백 후보
- 알림: 로컬 알림 (notifee 등)
- AI 롤플레이: LLM API + TTS (P1)
데이터 모델 [변경 v0.2]
User id, level_estimate, commute_ride_min, commute_walk_min,
commute_times, subway_mode_pref, created_at
TravelGoal user_id, destination, depart_date
Course id, title, type(travel|daily), tier(free|pro), order
Situation id, course_id, title, region_hint, order
Lesson id, situation_id, order
Expression id, lesson_id, en, ko, context, audio_url, accent, register(polite|casual)
Curveball id, lesson_id, prompt_en, prompt_ko, expected_responses(json),
audio_url, accent [신규]
Dialogue id, lesson_id, turns(json), audio_url
QuizItem id, lesson_id, type, payload(json)
Progress user_id, lesson_id, status, completed_at
Mastery user_id, expression_id, level(0~5), next_review_at,
success_count, fail_count [신규]
SpeakingLog user_id, expression_id, result(pass|unclear), snr_db, created_at
DailyRoutine user_id, date, slot(am|pm), mode(screen|audio), lesson_ids,
review_expression_ids, status [변경]
StreakState user_id, current, best, freeze_available, last_active_date [신규]
Subscription user_id, plan(free|pro|travel_pass), expires_at, store_txn [신규]
주요 변경: Curveball, Mastery(SRS), StreakState, Subscription 테이블 추가. Expression에 accent·register 추가. DailyRoutine에 mode·review_expression_ids 추가.
9. 로드맵 [재구성 v0.2]
v0.1 대비 변경: (a) 선행 검증 2주 신설 (b) 걷기 모드를 앞으로 (M6 → M3) (c) M1 스파이크 1주 → 2주
| 단계 | 기간 | 범위 | 완료 기준 |
|---|---|---|---|
| -1. 선행 검증 | 2주 | 랜딩·설문·인터뷰, 가격 민감도, 베타 대기자 | 발화 수용도 60%↑, 대기자 30명↑ |
| 0. 환경·스파이크 | 3주 | RN 세팅, CI, 블루투스 오디오 매트릭스, STT 소음 테스트 | 게이트 6개 조건 충족 → 12장 |
| 1. 콘텐츠 파이프라인 | 1주 | 스키마, 스타일 가이드, TTS·녹음 파이프라인, 샘플 10상황 | 스크립트 1회 실행으로 레슨 패키지 배포 |
| 2. 걷기 모드 | 2주 | 오디오 플로우, 따라 말하기, Curveball, 이어폰 제어 | 화면 안 보고 걷기 루틴 완료 |
| 3. 온보딩·루틴·SRS | 1.5주 | 온보딩, 루틴 생성기, 간격 반복 | 입력에 따라 루틴 변화, 복습 큐 동작 |
| 4. 지하철 모드 | 2주 | 화면/오디오 2모드, 카드·대화·퀴즈, 중단 복구 | 두 모드 모두 레슨 1개 완주 |
| 5. 오프라인·동기화 | 1주 | 다운로드 큐, 로컬 DB, 배치 업로드 | 비행기 모드 완료 → 복구 후 반영 |
| 6. 기록·알림·결제·분석 | 1.5주 | 스트릭·보호장치, 로컬 알림, 인앱 결제, 분석, Sentry | 알림 동작, 결제 플로우 완주 |
| 7. 베타 | 2주 | TestFlight / Play 내부 테스트 | 테스터 30명 2주 사용, WSU 수집 |
MVP 합계: 약 16주 (선행 검증 2주 + 개발 14주)
v0.1의 12주 대비 4주 증가. 대신 9주차에 핵심 기능이 불가능하다고 밝혀질 위험을 3주차 게이트로 앞당긴다.
이후
- 2단계: 잠금 화면 녹음(검증 결과에 따라), 원격 푸시, 스토어 정식 출시
- 3단계: AI 롤플레이, 노선 연동, 여행 모드 고도화
- 차량은 3단계 후보에서도 뺐다 (2026-09-19 결정 → 2장 "사용 환경 범위"). 러닝은 M1 게이트 당일 대표 판정으로 열릴 수 있다 — 같은 절의 재논의 트리거 표.
10. 수익 모델 [확정 v0.2 — D7]
v0.1에서 미결 상태였다. 가격은 나중에 붙이는 딱지가 아니라 콘텐츠 분할과 온보딩 설계를 바꾸는 변수이므로 착수 전 확정한다.
| 플랜 | 가격 | 범위 |
|---|---|---|
| 무료 | 0원 | 일일 루틴 무제한, 코스 2개(일상 스몰톡 + 여행 기초), 이진 발음 판정, 당일 오프라인 |
| Pro | 월 12,900 / 연 79,000 | 전체 코스, Curveball 훈련, 상세 발음 피드백, AI 롤플레이(3단계), 전체 오프라인 |
| 여행 패스 | 29,000 (90일) | 특정 여행지 코스 전체 + D-day 집중 모드. 구독 없이 단품 |
설계 근거 - 국내 영어 회화 앱 구독 수용 구간은 월 9,900~19,900원. 중간값에 배치 - 연간 할인율 49% — 카테고리 표준 - 여행 패스를 별도로 두는 이유: D-day가 최고의 결제 트리거이며, 구독을 거부하는 층도 단품은 구매한다 - 무료 범위를 넉넉히 둔 이유: 습관이 붙기 전에 막으면 리텐션 자체가 죽는다. 일일 루틴은 제한하지 않는다
페이월 노출 지점: 잠긴 코스 진입 / 여행 D-day 화면 / 상세 발음 피드백 시도
11. 성공 지표 [변경 v0.2 — C10]
북극성 지표
주간 발화 문장 수 (WSU, Weekly Spoken Utterances) — 활성 사용자 평균 주 50문장
v0.1의 "주당 학습 세션 수"는 앱을 열기만 하고 한 마디도 안 해도 카운트된다. 이 제품의 본질은 발화량이다.
보조 지표
| 지표 | 목표 | 비고 |
|---|---|---|
| D1 리텐션 | 50% | 온보딩 품질 |
| D7 리텐션 | 40% | 습관 형성 |
| D30 리텐션 | 20% | 제품-시장 적합 신호 |
| 걷기 모드 진입률 | 60% | 지하철 세션 대비. 핵심 가설 지표 |
| 발화 시도율 | 70% | 재생된 문장 대비 실제 발화 |
| 복습 도달률 | 80% | SRS 큐 소화 비율 |
| 레슨 완료율 | 75% | 시작 대비 완료 |
| 무료→Pro 전환율 | 3% | 카테고리 평균 2~5% |
| 여행 코스 완주율 | 50% | D-day 도달 시점 기준 |
12. 리스크와 대응 [보강 v0.2]
| # | 리스크 | 심각도 | 대응 |
|---|---|---|---|
| R1 | [신규] 길에서 소리 내어 말하기를 사회적으로 꺼림 — 제품 절반이 무효화 | 치명 | 선행 검증 2주로 사전 확인. "통화하는 척" UX, 속삭임 허용, 명시적 안심 메시지. 60% 미만 시 제품 전제 재설계 |
| R2 | [신규] 블루투스 녹음 전환 시 음질 급락 — A2DP → HFP(16kHz 모노). 재생이 전화 음질이 됨 | 치명 | M1에서 OS 2 × 오디오 세션 구성 2 × 상황 3 = 12케이스(C01~C12) 실측 (이어폰은 축이 아니라 한 벌 = 회차 하나). 게이트 조건. 미충족 시 유선 권장 또는 판정 없는 따라 말하기로 축소 |
| R3 | 소음 환경 STT 정확도 (70~80dB, 비원어민 발음) | 높음 | 점수 폐기, 이진 판정 + 관대한 통과. SNR 기반 상세 피드백 분기. STT 엔진 추상화로 교체 가능성 확보 |
| R4 | 백그라운드 녹음 제약 (Android 14 FGS 제한, iOS 심사) | 높음 | M1 스파이크로 조기 확인. 불가 시 짧게 화면 켜기 대안 |
| R5 | [신규] 만원 지하철에서 화면 학습 불가 | 중간 | 오디오 모드 분기(5.3.2). 퇴근 기본값 오디오 |
| R6 | [신규] 스트릭이 깨지는 순간의 이탈 | 중간 | 주말 제외, 프리즈 주 1회, 대체 모드, 누적 지표 전면화 |
| R7 | AI 생성 콘텐츠의 부자연스러움 | 중간 | 스타일 가이드 선행 문서화, 핵심 100문장 실녹음, 사용자 신고 기능 |
| R8 | 걷기 중 안전 사고 | 중간 | 화면 자동 소등, 화면 켜면 자동 일시정지. 경고문에 의존하지 않음 |
| R9 | [신규] 이어폰 미지참일에 할 일이 없음 | 낮음 | 이어폰 없는 날 모드 |
| R10 | TTS·STT·LLM API 비용 | 낮음 | 음성 사전 생성 후 캐싱, STT는 온디바이스 우선, AI 롤플레이 횟수 제한 |
| R11 | [신규] 오너의 실기기 검증 시간 부족이 일정 병목 | 높음 | 주당 최소 10시간 확보 필요. 미달 시 일정 20주로 재산정 |
R2 12케이스의 정본 — 축·케이스 식별자(C01~C12)·현장 절차·판정 규칙의 정본은 ogamyeo-app
docs/m1-r2-case-matrix.md 이고, 기계가 읽는 같은 표가 같은 저장소 src/lib/m1/cases.ts 에 있다.
위 R2 행과 개발계획서 6.1 의 서술은 그 정본에서 옮겨 온 것이고, 값이 어긋나면 정본이 이긴다.
회차 당일 손으로 채우는 칸은 이 저장소 docs/실기기_실측_회차_기록양식.md 에 있다.
[이력] 축은 2026-09-16 ogamyeo-app #19(PR #27)로 재확정됐다 — v0.2 초안이 축으로 쓴
이어폰 모델 3종과 조합 4종(A~D)은 폐기되고 OS 2 × 오디오 세션 구성 2 × 상황 3 이 됐다.
분모 12는 그대로다(M1 게이트 판정문이 R2 실패 조합 N / 12 로 나간다).
13. 미결정 사항 — 확인 필요
해소됨
아래 6건은 v0.2 작성 시점에 확정됐고, 그 아래 [v0.2 이후] 표시가 붙은 건은 v0.2 발행 뒤 별도 결정으로 닫힌 것이다.
- ~~수익 모델~~ → 10장
- ~~대상 레벨~~ → 레벨 진단 폐기, 상황 선택 + 자동 보정
- ~~발음 피드백 수준~~ → 이진 판정 + 조건부 상세
- ~~원어민 검수 리소스~~ → 스타일 가이드 + 핵심 100문장 녹음(30~50만원)
- ~~베타 테스터 모집~~ → 선행 검증 단계 대기자 명단
- ~~여행 코스 우선 지역~~ → 동남아·일본, 억양 믹스 차별점
- [v0.2 이후] ~~앱 이름·브랜딩~~ → '오가며' 확정 — 근거: 2026-09-16 오너 지시(Slack #제품, "부대표 오가며로 확정해") · 같은 자리에서 남은 결정 기록("실행함 — 제품명을 '오가며'로 확정") ·
commute-probe#30(해당 저장소 반영 완료). 후보 4안(오가며 / 커뮤트 / 말하며 걷기 / 8시 20분)은 폐기됐고, 문서·홈페이지에서 "(가칭)" 표기를 뺀다. 이 건이 쓰던 번호 U3 는 재사용하지 않는다 — 아래 표의 다음 항목은 U9 부터 붙인다. 단 이름이 확정됐다는 것과 그 이름을 쓸 수 있다는 것은 다르다: 상표·도메인·앱스토어 중복 확인은 아직 아무도 보지 않았고, 아래 표 U9 로 따로 남아 있다 - [2026-10-09] ~~U9 '오가며' 상표·도메인·앱스토어 중복 확인~~ → 충돌 없음 (신우섭 CTO 확인, 2026-10-09 실제 조회). 상표: KIPRIS에서 '오가며' 정확 일치 2건은 모두 소멸(1974 구3류 과자·빵, 1999 구42류 식당업)이고, 9류·41류에는 출원·등록이 없다. 'OGAMYEO'는 0건이다. 지켜볼 것: '오며가며'(4020260151961, 35류 통신판매중개, 2026-07 출원)가 살아 있는 출원이다. 도메인: ogamyeo.com/.app/.io/.kr/.co.kr 모두 미등록이다(RDAP·whois·DNS). 앱스토어: iOS(iTunes Search API)와 Google Play 모두 같거나 비슷한 이름의 앱이 없다. 후속(미결 아님, 권고): 9·41류 출원 검토(일상어라 식별력 판단은 변리사에게), ogamyeo.com 또는 .kr 선점. 이 확인에 따라 제품 페이지 ogamyeo.wssin.app 을 공개했다. 상표 사용 표기(™·®)는 출원 전까지 쓰지 않는다
남은 항목 [보강 v0.2 — 담당·기한 배정]
이 표가 미결 항목의 유일한 정본이다. 별도 추적 문서를 만들지 않는다. 항목이 해소되면 이 표에서 지우지 말고, 결정 내용을 본문 해당 절에 반영한 뒤 위 "해소됨" 목록으로 옮긴다.
기한 표기는 회의록 §8 액션 아이템과 §9 M1 게이트, 개발계획서 7.1(선행 검증 2주 + 개발 14주)의 마일스톤 표현을 그대로 쓴다. 이 표는 새 날짜를 만들지 않는다.
| # | 항목 | 회의록 §8 | 담당 (결정 주체) | 기한 | 무엇이 정해지면 해소인가 |
|---|---|---|---|---|---|
| U1 | 오너 주당 리뷰·테스트 가능 시간 — 일정 산정의 전제 | A1 (오너 / 착수 전) | 신우섭 CTO — 실기기 검증 주체 | 착수 전 (선행 검증 V 시작 전) | 주당 투입 가능 시간이 숫자로 확정. 10시간 이상이면 개발계획서 7.1의 16주 일정을 그대로 확정, 미달이면 7.4에 따라 20주 재산정안을 강시영 대표가 승인 — 둘 중 하나가 문서에 반영되면 해소 |
| U2 | 테스트 기기·이어폰 3종 확보 (AirPods급 / 갤럭시버즈급 / 저가) | A2 (오너 / W1) | 신우섭 CTO — 비용 지출 + 실기기 | W1 | 기기(iOS·Android 각 1대)와 이어폰 3종이 실물로 확보되고, 각 모델명이 회차 헤더에 적혀 어느 한 벌로 도는 회차인지 기록되면 해소 (개발계획서 6.1 · 회차 헤더 양식은 docs/실기기_실측_회차_기록양식.md §1). 이어폰은 12케이스의 축이 아니라 회차 파라미터(한 벌 = 회차 하나)라서 '대상 기기 목록' 이 12칸을 정하지 않는다 — 3종이면 같은 12칸을 세 벌 돌린다. 기기가 없으면 A6 스파이크(W2~W3) 착수 불가로 게이트가 밀리고, 이어폰은 한 벌만 있어도 회차 1은 돌아가므로 3종 미확보는 착수를 막지 않고 기기 커버리지를 좁힌다. [2026-09-19 추가] 같은 날 회의는 M1 2주 추정의 전제로 "실기기 3종 × OS 2버전 × 이어폰 2종" 을 말했다 — 이 행의 현재 문장(기기 iOS·Android 각 1대 + 이어폰 3종)과 숫자가 다르다. 어느 쪽이 정본인지는 신우섭 CTO가 commute-probe #69에서 정한다. 그 전까지 이 행의 숫자를 고치지 않는다 |
| U4 | 우선 플랫폼: iOS·Android 동시 vs 한쪽 먼저 | — | 강시영 대표 — 방향 결정 (신우섭 CTO 기술 검토) | M1 게이트(W3) 판정과 함께, 늦어도 M2 착수 전 | "동시" 또는 "한쪽 먼저 + 어느 쪽"이 선택되고, 한쪽 먼저면 나머지 플랫폼 착수 시점이 개발계획서 7.1 마일스톤 표에 반영되면 해소. M1 매트릭스 결과(R2)가 플랫폼별로 갈릴 수 있어 게이트 이전에 확정하지 않는다 |
| U5 | 최소 지원 OS 버전 | — | 신우섭 CTO — 기술 전제 확정 | M1 게이트(W3) — 스파이크 실측 결과를 근거로 | iOS·Android 최소 버전이 숫자로 적히고, Android 14 FGS 제약(R4)에 대한 대응이 그 버전 기준으로 정리되면 해소 |
| U6 | 운영 예산: 월 API 비용 허용 범위 (TTS 초기 제작비 + 상시 STT 폴백 비용) | — (회의록 §7은 "⚠️ 오너 확인 필요") | 신우섭 CTO — 비용 지출 (상한 변경은 강시영 대표 승인) | M1 게이트(W3) 이후, M2 착수 전 | 월 상한 금액이 원 단위로 확정되고, 상한 도달 시 동작(폴백 STT 중단 / 캐시 전용 전환 등)이 한 줄로 정해지면 해소. R10 대응의 전제 |
| U7 | 원어민 성우 예산 승인: 30~50만원 | — (§7에서 금액만 산출, 승인 미정) | 신우섭 CTO — 비용 지출 승인 | M2 착수 전 (녹음이 M2 산출물) | 승인 또는 거절이 금액으로 확정. 거절이면 핵심 100문장을 TTS로 대체할지 여부까지 정해져야 해소 |
| U8 | M3 사용 환경 범위안의 대표 최종 확정 — 2장 "사용 환경 범위"(지하철 2모드 + 걷기 / 차량 제외·트리거 없음 / 러닝 제외·트리거 유지) | — (2026-09-19 회의·부대표 결재. 2026-09-13 회의록 §8에는 없음) | 강시영 대표 — 방향 결정 | M1 게이트(W3) 이전 | 대표가 범위안을 승인하거나, 다르게 판단한 내용이 2장 "사용 환경 범위" 절에 반영되면 해소. 부대표 결재로 후속 작업(PRD 반영·설문 2문항·M1 추정 재확인)은 이미 착수했고, 되돌림 비용은 그 절의 문구 수정 1건이다 |
| U9 | ~~'오가며' 상표·도메인·앱스토어 중복 확인~~ → 해소됨 (2026-10-09, 충돌 없음 · 위 "해소됨" 참고) — 이름 자체는 2026-09-16 오너 지시로 확정됐고(위 "해소됨"), 여기 남은 것은 그 이름을 밖에 걸 수 있는지다 | — (2026-09-16 Slack #제품에서 백승현 부대표가 "상표 검색·도메인·앱스토어 중복까지 걸려서 되돌리기 비싼 건"이라고 지적. 2026-09-13 회의록 §8에는 없음) | 신우섭 CTO — 기술·비용 전제 확정 (충돌이 나와 이름을 바꿔야 하는 상황이면 그때는 강시영 대표 결정) | 랜딩·스토어 등록 전 (선행 검증 랜딩 A3 공개와 스토어 등록 중 먼저 오는 쪽) | 국내 상표 출원 현황(상품류 9·41 기준) · 도메인 1개 이상 확보 가능 여부 · iOS App Store와 Google Play의 동명 앱 존재 여부 — 이 셋을 실제로 조회한 결과가 "충돌 없음" 또는 "충돌 있음 + 대응(표기 변경·부제 추가·이름 재검토 중 택1)"으로 이 표에 적히면 해소. 조회 전에는 스토어 등록과 상표 사용 표기(™·®)를 진행하지 않는다 — 되돌리는 값이 거기서부터 비싸진다. 회사 홈페이지·사내 문서의 제품명 표기는 문구 수정 1건이라 이 제약에 걸리지 않는다 |
담당 표기 원칙 — 회의록 §8의 "오너"는 역할에 따라 나눠 적는다. 실기기 검증·비용 지출·기술 전제는 신우섭 CTO, 방향·우선순위·최종 결정은 강시영 대표. 회의록에 액션 번호가 있는 항목(U1·U2)은 번호와 원문 기한을 그대로 인용했고, 나머지 6건(U4~U9)은 2026-09-13 회의록 §8에 대응 액션이 없어 이 표에서 처음 담당을 배정한 것이다 — 그중 U8은 2026-09-19 회의·부대표 결재를, U9는 2026-09-16 Slack #제품의 부대표 지적을 근거로 등재했다. 번호는 한 번 쓰면 다시 쓰지 않는다: U3(앱 이름·브랜딩)은 2026-09-16 해소돼 표에서 빠졌고, 그 번호를 새 항목에 돌려쓰지 않아 다음 항목이 U9다.
게이트 영향 — U1·U2가 착수 전~W1에 확정되지 않으면 회의록 §9 M1 게이트(A9, W3 말) 판정 자체가 불가능하다. 이 두 건은 다른 미결 항목보다 먼저 처리한다. 단 U2 안에서 기기와 이어폰은 무게가 다르다 — 기기가 없으면 실측이 아예 안 되지만, 이어폰은 한 벌이면 회차 1이 돌아간다(위 해소 조건).